LunarLander中的Android IllegalThreadStateException

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

我相信这是因为Surface和Activity的处理方式不一致。 当你离开LunarLander应用程序时,表面被破坏(调用surfaceDestroyed)但是Activity只被暂停(调用onPause)。 当Activity恢复时,将创建表面(调用surfaceCreated)并尝试再次启动绘图线程。

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

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

在我自己的测试中,我在surfaceCreated()方法中创建了绘制线程,这完全解决了这个问题。 这是我的方法实现:

@Override public void surfaceCreated(SurfaceHolder arg0) { _thread = new DrawThread(getHolder()); _thread.setRunning(true); _thread.start(); } 

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

要修复的两个选项:

a)在surfaceCreated() )中启动一个新线程 – 如上所述。

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