首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LunarLander中的安卓IllegalThreadStateException

LunarLander中的安卓IllegalThreadStateException
EN

Stack Overflow用户
提问于 2009-03-25 19:45:18
回答 3查看 3.6K关注 0票数 1

只需对我的应用程序进行润色,并使其在用户离开后恢复。当应用程序恢复时,我会得到一个IllegalThreadStateException,这非常烦人。这个问题存在于谷歌给出的Lunar Lander的例子中。有没有人找到了在使用surfaceView时恢复工作的方法?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-03-26 17:10:37

我认为这是由于Surface和Activity的处理方式不一致造成的。当您离开LunarLander应用程序时,表面会被销毁(调用surfaceDestroyed),但活动只会暂停(调用onPause)。恢复活动时,将创建曲面(调用surfaceCreated),并尝试再次启动绘图线程。

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

我认为this thread提出了一个可能的解决方案,尽管我不知道它是否有效。

票数 4
EN

Stack Overflow用户

发布于 2010-08-21 02:15:32

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

代码语言:javascript
复制
@Override
public void surfaceCreated(SurfaceHolder arg0) {
    _thread = new DrawThread(getHolder());
    _thread.setRunning(true);
    _thread.start();
}
票数 2
EN

Stack Overflow用户

发布于 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。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/683136

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档