1

只是来完善我的应用程序并在用户离开后使其恢复。当应用程序恢复时,我得到一个 IllegalThreadStateException,这很烦人。这个问题出现在谷歌给出的Lunar Lander示例中。有没有人在使用 SurfaceView 时找到恢复工作的方法?

4

3 回答 3

4

我相信这是由于 Surface 和 Activity 的处理方式不同造成的。当您离开 LunarLander 应用程序时,表面被销毁(调用 surfaceDestroyed),但 Activity 仅暂停(调用 onPause)。当活动恢复时,表面被创建(调用surfaceCreated)并尝试再次启动绘图线程。

这意味着创建线程发生在 Activity 的生命周期中,而销毁线程发生在 SurfaceView 的生命周期中,它们并不总是对应,因此会出现 IllegalThreadStateException。解决方案是将线程绑定到一个生命周期或另一个生命周期,而不是两者。

我认为这个线程提出了一个可能的解决方案,虽然我不知道它是否有效。

于 2009-03-26T17:10:36.987 回答
2

在我自己的测试中,我在surfaceCreated()方法中创建了绘图线程,这样就彻底解决了这个问题。这是我的方法实现:

@Override
public void surfaceCreated(SurfaceHolder arg0) {
    _thread = new DrawThread(getHolder());
    _thread.setRunning(true);
    _thread.start();
}
于 2010-08-20T18:15:32.097 回答
0

所以在代码中,当surfaceDestroyed()被调用时,它设置mRun为 false 并调用thread.join(). 这会导致线程完成并终止。当应用程序再次启动并被surfaceCreated()调用时,它会调用thread.start(). 这是无效的,因为线程死后无法启动。

修复的两个选项:

a) 在 - 中启动一个新线程,surfaceCreated()如上。

b)或者添加一个检查surfaceDestroyed()Activity.isFinishing()仅在为真时结束线程。为此,我用另一个 while 循环包围了线程,如果返回 true while(mRun),则该循环仅设置为 false 。isFinishing()

于 2010-11-05T02:07:57.443 回答