只是来完善我的应用程序并在用户离开后使其恢复。当应用程序恢复时,我得到一个 IllegalThreadStateException,这很烦人。这个问题出现在谷歌给出的Lunar Lander示例中。有没有人在使用 SurfaceView 时找到恢复工作的方法?
3 回答
我相信这是由于 Surface 和 Activity 的处理方式不同造成的。当您离开 LunarLander 应用程序时,表面被销毁(调用 surfaceDestroyed),但 Activity 仅暂停(调用 onPause)。当活动恢复时,表面被创建(调用surfaceCreated)并尝试再次启动绘图线程。
这意味着创建线程发生在 Activity 的生命周期中,而销毁线程发生在 SurfaceView 的生命周期中,它们并不总是对应,因此会出现 IllegalThreadStateException。解决方案是将线程绑定到一个生命周期或另一个生命周期,而不是两者。
我认为这个线程提出了一个可能的解决方案,虽然我不知道它是否有效。
在我自己的测试中,我在surfaceCreated()方法中创建了绘图线程,这样就彻底解决了这个问题。这是我的方法实现:
@Override
public void surfaceCreated(SurfaceHolder arg0) {
_thread = new DrawThread(getHolder());
_thread.setRunning(true);
_thread.start();
}
所以在代码中,当surfaceDestroyed()
被调用时,它设置mRun
为 false 并调用thread.join()
. 这会导致线程完成并终止。当应用程序再次启动并被surfaceCreated()
调用时,它会调用thread.start()
. 这是无效的,因为线程死后无法启动。
修复的两个选项:
a) 在 - 中启动一个新线程,surfaceCreated()
如上。
b)或者添加一个检查surfaceDestroyed()
以Activity.isFinishing()
仅在为真时结束线程。为此,我用另一个 while 循环包围了线程,如果返回 true while(mRun)
,则该循环仅设置为 false 。isFinishing()