只需对我的应用程序进行润色,并使其在用户离开后恢复。当应用程序恢复时,我会得到一个IllegalThreadStateException,这非常烦人。这个问题存在于谷歌给出的Lunar Lander的例子中。有没有人找到了在使用surfaceView时恢复工作的方法?
发布于 2009-03-26 17:10:37
我认为这是由于Surface和Activity的处理方式不一致造成的。当您离开LunarLander应用程序时,表面会被销毁(调用surfaceDestroyed),但活动只会暂停(调用onPause)。恢复活动时,将创建曲面(调用surfaceCreated),并尝试再次启动绘图线程。
这意味着创建线程发生在活动的生命周期中,销毁线程发生在SurfaceView的生命周期中,这并不总是对应的,因此IllegalThreadStateException。解决方案是将线程绑定到一个或另一个生命周期,而不是两个。
我认为this thread提出了一个可能的解决方案,尽管我不知道它是否有效。
发布于 2010-08-21 02:15:32
在我自己的测试中,我在surfaceCreated()方法中创建了绘图线程,这完全解决了这个问题。这是我的方法实现:
@Override
public void surfaceCreated(SurfaceHolder arg0) {
_thread = new DrawThread(getHolder());
_thread.setRunning(true);
_thread.start();
}发布于 2010-11-05 10:07:57
因此,在代码中,当调用surfaceDestroyed()时,它将mRun设置为false并调用thread.join()。这会导致线程完成并终止。当应用程序再次启动并调用surfaceCreated()时,它将调用thread.start()。这是无效的,因为线程在死后无法启动。
要修复的两个选项:
a)在surfaceCreated()中启动一个新线程-如上所述。
b)或者在surfaceDestroyed()中添加一个针对Activity.isFinishing()的检查,以便只有在为真时才结束线程。为此,我用另一个while循环包围了线程中的while(mRun),该循环仅在isFinishing()返回true时设置为false。
https://stackoverflow.com/questions/683136
复制相似问题