刚开始抛光我的应用程序并在用户离开后恢复它。当应用程序恢复时,我得到一个IllegalThreadStateException,这非常烦人。此问题出现在Lunar Lander的google中。有没有人找到使用surfaceView时恢复工作的方法?
答案 0 :(得分:4)
我认为这是因为Surface和Activity的处理方式存在差异。当您离开LunarLander应用程序时,表面将被销毁(调用surfaceDestroyed),但仅暂停活动(调用onPause)。当Activity恢复时,将创建表面(调用surfaceCreated)并尝试再次启动绘图线程。
这意味着创建Thread会在Activity的生命周期中发生,并且销毁线程会发生在SurfaceView的生命周期中,而生命周期并不总是对应的,因此是IllegalThreadStateException。解决方案是将线程绑定到一个生命周期或另一个生命周期,而不是两者。
我认为this thread提出了一个可能的解决方案,但我不知道它是否有效。
答案 1 :(得分:2)
在我自己的测试中,我在surfaceCreated()方法中创建了绘制线程,这完全解决了这个问题。这是我的方法实现:
@Override
public void surfaceCreated(SurfaceHolder arg0) {
_thread = new DrawThread(getHolder());
_thread.setRunning(true);
_thread.start();
}
答案 2 :(得分:0)
因此,在代码中,当调用surfaceDestroyed()
时,它会将mRun
设置为false并调用thread.join()
。这导致线程完成并死亡。当应用再次启动并调用surfaceCreated()
时,它会调用thread.start()
。这是无效的,因为线程在死后无法启动。
要修复的两个选项:
a)在surfaceCreated()
中开始一个新主题 - 如上所述。
b)或者surfaceDestroyed()
对Activity.isFinishing()
添加一个检查,如果为真,则仅结束该主题。为此,我使用另一个while循环包围线程中的while(mRun)
,如果isFinishing()
返回true,则仅设置为false。