LunarLander 中的 Android IllegalThreadStateException
-
22-08-2019 - |
题
只是来完善我的应用程序并使其在用户离开后恢复。当应用程序恢复时,我收到一个 IllegalThreadStateException,这非常烦人。这个问题出现在谷歌给出的例子中 月球着陆器. 。有没有人找到使用 SurfaceView 时恢复工作的方法?
解决方案
我认为这是由于 Surface 和 Activity 的处理方式不同造成的。当您离开 LunarLander 应用程序时,表面将被销毁(调用 surfaceDestroyed),但 Activity 仅暂停(调用 onPause)。当 Activity 恢复时,将创建表面(调用 surfaceCreated),并尝试再次启动绘图线程。
这意味着创建线程与 Activity 的生命周期一起发生,销毁线程与 SurfaceView 的生命周期一起发生,这并不总是对应的,因此会出现 IllegalThreadStateException。解决方案是将线程绑定到一个生命周期或另一个生命周期,而不是同时绑定到两者。
我认为 这个线程 提出了一个可能的解决方案,尽管我不知道它是否有效。
其他提示
在我自己的测试,我创建的surfaceCreated()方法引出线,这彻底解决了这个问题。这是我的方法实现:
@Override
public void surfaceCreated(SurfaceHolder arg0) {
_thread = new DrawThread(getHolder());
_thread.setRunning(true);
_thread.start();
}
因此,在该代码中,当surfaceDestroyed()
被调用时,它设置mRun
为假,并调用thread.join()
。这将导致线程来完成和死亡。当应用程序再次启动并surfaceCreated()
被调用时,它调用thread.start()
。这是无效的,因为它死后线程无法启动。
两个选项来解决:
a)启动在surfaceCreated()
一个新的线程 - 。如上述
B)或在surfaceDestroyed()
添加检查针对Activity.isFinishing()
如果真仅结束线程。要做到这一点,我与另一个while循环,如果while(mRun)
返回true,即只设置为false线包围的isFinishing()
。