Libgdx 解决部分Android机型锁屏崩溃crash

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)