LunarLander中的Android IllegalThreadStateException

时间:2009-03-25 19:45:18

标签: java android surfaceview illegalstateexception

刚开始抛光我的应用程序并在用户离开后恢复它。当应用程序恢复时,我得到一个IllegalThreadStateException,这非常烦人。此问题出现在Lunar Lander的google中。有没有人找到使用surfaceView时恢复工作的方法?

3 个答案:

答案 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。