栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 移动开发 > Android

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

Android 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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就继承这个自定义的类就行。

总结

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/155395.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号