Libgdx解决部分Android机型锁屏崩溃的方法

libgdx使用了全屏模式之后,在某些机型会出现崩溃的情况,两年前就存在了,一直到现在为止,官方都没进行修复,其崩溃原因就是在源码AndroidGraphics.java中的onPause可以看到这样子的一段代码:

void pause () {
    synchronized (synch) {
      if (!running) return;
      running = false;
      pause = true;
      while (pause) {
        try {
          // TODO: fix deadlock race condition with quick resume/pause.
          // Temporary workaround:
          // Android ANR time is 5 seconds, so wait up to 4 seconds before assuming
          // deadlock and killing process. This can easily be triggered by opening the
          // Recent Apps list and then double-tapping the Recent Apps button with
          // ~500ms between taps.
          synch.wait(4000);
          if (pause) {
            // pause will never go false if onDrawFrame is never called by the GLThread
            // when entering this method, we MUST enforce continuous rendering
            Gdx.app.error(LOG_TAG, "waiting for pause synchronization took too long; assuming deadlock and killing");
            android.os.Process.killProcess(android.os.Process.myPid());
          }
        } catch (InterruptedException ignored) {
          Gdx.app.log(LOG_TAG, "waiting for pause synchronization failed!");
        }
      }
    }
  }

崩溃的提示就是在这个方法中进行抛出的,解决方法就是,不让他抛出这个错误,就是在try里面把pause改为false,目前的解决方法是这样子,静候官方的修复了,自定义一个类,例如我用的是AndroidFragmentApplication,我自定义一个PatchedAndroidFragmentApplication,在onPause之后利用线程延迟100毫秒,执行一个onDrawFrame,使得pause为false即可:

open class PatchedAndroidFragmentApplication : AndroidFragmentApplication() {
  private val exec = Executors.newSingleThreadExecutor()
  private val forcePause = Runnable {
    try {
      Thread.sleep(100)
    } catch (e: InterruptedException) {
    }
    graphics.onDrawFrame(null)
  }
  override fun onPause() {
    if (activity!!.window.attributes.flags and WindowManager.LayoutParams.FLAG_FULLSCREEN == WindowManager.LayoutParams.FLAG_FULLSCREEN) {
      // 是全屏
      exec.submit(forcePause)
    }
    super.onPause()
  }
}

然后你的Fragment就继承这个自定义的类就行。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。如果你想了解更多相关内容请查看下面相关链接

(0)

相关推荐

  • Android在Kotlin中更好地使用LitePal

    Kotlin 是一个用于现代多平台应用的静态编程语言,由 JetBrains 开发. Kotlin可以编译成Java字节码,也可以编译成JavaScript,方便在没有JVM的设备上运行. Kotlin已正式成为Android官方支持开发语言. 自从LitePal在2.0.0版本中全面支持了Kotlin之后,我也一直在思考如何让LitePal更好地融入和适配Kotlin语言,而不仅仅停留在简单的支持层面. Kotlin确实是一门非常出色的语言,里面有许多优秀的特性是在Java中无法实现的.因此,

  • android自定义环形对比图效果

    本文实例为大家分享了android自定义环形对比图的具体代码,供大家参考,具体内容如下 1.首先在res/values里创建一个attr.xml的文件. <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="AnswerChartView"> <attr name="radius" for

  • Android drawable微技巧,你不知道的drawable细节

    话说微技巧这个词也是我自己发明的,因为drawable这个东西相信大家天天都在使用,每个人都再熟悉不过了,之所以叫微技巧就是对于这个我们再熟悉不过的技术,可能还有一些你所不知道的细节,那今天我们就来一起探究一下这些微小的细节吧. 大家都知道,在Android项目当中,drawable文件夹都是用来放置图片资源的,不管是jpg.png.还是9.png,都可以放在这里.除此之外,还有像selector这样的xml文件也是可以放在drawable文件夹下面的. 但是如果你现在使用Android Stu

  • Android最简单的状态切换布局实现教程

    前言 项目中经常遇到这样一种情况,新打开的界面需要加载数据,存在多种状态的结果,需要根据不同结果展示界面,这个过程归纳起来可以分为五种状态:初始状态.请求状态.空数据状态.网络错误状态.成功请求状态. 如果多个界面都存在这个流程,那么封装整个过程的调用就很有必要了,既可以简化调用过程,又可以很方便的管理整个流程. 下面话不多说了,来一起看看详细的介绍吧 功能简介 正在加载数据 数据加载失败 数据加载为空 网络加载失败 重试点击事件 支持自定义布局 效果图展示 最简单的使用方式 1.Add it

  • Android指纹识别API讲解,一种更快更好的用户体验

    我发现了一个比较怪的现象.在iPhone上使用十分普遍的指纹认证功能,在Android手机上却鲜有APP使用,我简单观察了一下,发现Android手机上基本上只有支付宝.微信和极少APP支持指纹认证功能,就连银行和金融类的应用都基本不支持,甚至很多开发者都不知道Android系统是有指纹认证的官方API的. 事实上,Android从6.0系统开始就支持指纹认证功能了,但是指纹功能还需要有硬件支持才行,而Android手机的硬件都是由各厂商生产的,手机档次也参差不齐,因此不能像iPhone那样保证

  • Android使用libgdx实现模拟方向键控制角色移动的方法

    本文实例讲述了Android使用libgdx实现模拟方向键控制角色移动的方法.分享给大家供大家参考,具体如下: package com.demo; import android.os.Bundle; import com.badlogic.gdx.backends.android.AndroidApplication; //Libgdx的Texture与Sprite使用 public class LibgdxActivity extends AndroidApplication { public

  • 详解 Android中Libgdx使用ShapeRenderer自定义Actor解决无法接收到Touch事件的问题

    详解 Android中Libgdx使用ShapeRenderer自定义Actor解决无法接收到Touch事件的问题 今天在项目中实现了一个效果,主要是画一个圆.为了后续使用方便,将这个圆封装在一个自定义Actor(CircleActot)中,后续想显示一个圆的时候,只要创建一个CircleActor中即可. 部分代码如下所示: package com.ef.smallstar.unitmap.widget; import android.content.res.Resources; import

  • Android 游戏引擎libgdx 资源加载进度百分比显示案例分析

    因为案例比较简单,所以简单用AndroidApplication -> Game -> Stage 搭建框架 一.主入口,无特殊 复制代码 代码如下: public class App extends AndroidApplication { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //初始化Demo initialize(new Demo()

  • 详解Android Libgdx中ScrollPane和Actor事件冲突问题的解决办法

    详解Android Libgdx中ScrollPane和Actor事件冲突问题的解决办法 在Libgdx的使用过程中,经常会用到ScrollPane这个widget,来实现滑动效果, 如下所示: 但是如果想在上面的效果上添加一点扩展,比如ScrollPane中的Actor可以从ScrollPane中移出来,并添加到Stage中,则需要添加额外的逻辑 具体代码参考如下: /** * Created by Danny.姜 on 17/7/26. */ public class TestAdapter

  • 详解Android 检测权限的三种写法

    本文介绍了详解Android 检测权限的三种写法,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 权限检测生效条件: targetSdkVersion 以及 compileSdkVersion 升级到 23 及以上 运行 Android 系统 6.0 及以上 三种检测权限写法: public static boolean checkPermission1(Context context, String[] permissions) { PackageManager p

  • Android Studio轻松构建自定义模板的步骤记录

    前言 之前其实有从鸿洋的文章有了解过AS的模板开发,一直想做一些自己经常使用的模板,以减少重复代码工作,但是发现太费劲了,所以一直搁置.然后昨天无意中发现了这个插件TemplateBuilder,然后学习了一下,基本掌握了这个插件的使用,以及快速构建自己的模板.下面来分享一下. 一.TempateBuilder插件安装 环境:Android Studio 3.1.1 方式1:AS内安装 方式2:本地安装 先去GitHub开源地址上下载插件压缩包,或者到JetBrains上的插件地址(要翻 墙哦)

随机推荐