只是来完善我的应用程序并使其在用户离开后恢复。当应用程序恢复时,我收到一个 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()

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top