当前位置: 首页 > 编程笔记 >

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

苏志
2023-03-14
本文向大家介绍Libgdx解决部分Android机型锁屏崩溃的方法,包括了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就继承这个自定义的类就行。

总结

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

 类似资料:
  • 我正在尝试更新到最新的LibGDX版本1.9.2(我已经使用了一段时间的旧版本),但是在创建了一个新的LibGDX项目并运行了默认的badlogic徽标应用程序之后,它在Android上崩溃了。我已经多次创建了新的LibGDX项目,没有出现任何问题,所以现在肯定有些不同了,因为这次它不起作用了。我的项目中没有错误,桌面项目工作正常,只是在我尝试运行Android项目时崩溃了。 我使用安装应用程序创

  • 我一直在尝试将. ttf字体添加到我的android移动应用程序中。我正在使用Libgdx引擎创建我的应用程序,并尝试添加True Type扩展以允许使用. ttf字体。这是我正在运行以尝试创建字体的代码。 当我调用这段代码时,我的应用程序会给我消息,没有其他信息。我已经在核心和android项目中包含了和。我已经单击了在这两个项目上导出它们的选项。我已经在和文件夹中包含了两个文件。 谁能告诉我为

  • 本文向大家介绍Android 6.0调用相机图册崩溃的完美解决方案,包括了Android 6.0调用相机图册崩溃的完美解决方案的使用技巧和注意事项,需要的朋友参考一下 最近客户更新系统发现,以前的项目在调用相机的时候,闪退掉了,很奇怪,后来查阅后发现,Android 6.0以后需要程序授权相机权限,默认会给出提示,让用户授权,个人感觉这一特性很好,大概如下: 导入Android V4, V7包!

  • (现在,我只想在我的屏幕上放一张地图) 下面是XML 代码如下: 当我查看调试时,我得到了这样的结果:

  • 我试图在应用程序启动的实际闪屏之前删除系统白色飞溅。我遵循以下主题: 如何修复应用程序启动上的白屏?并为飞溅活动创建了半透明样式: 但在安装后首次启动时,应用程序崩溃并出现以下未处理的异常: 首次启动后应用程序正常启动。我可以修复这种行为吗?如果这很重要,我正在使用最新的android支持库

  • 问题内容: 这个问题简短而简单。如何在LibGDX中创建分屏效果。如果我创建了两个摄像机,那么所要做的就是在某处绘制一个摄像机,然后绘制下一个摄像机,覆盖前一个摄像机。然后,我考虑使用多个屏幕,但看起来不起作用,因为它仅支持调整大小,而不支持在窗口中重新定位。我也在使用Box2DDebugRenderer和ShapeRenderer,因此它也需要在拆分屏幕的限制下将其剪切掉。LibGDX网站上似乎