“线程已经启动”,当恢复活动

这里是我的情况:我正在构build一个Android游戏,我的游戏的活动是由一个自定义的SurfaceView组成的,它具有一个用于游戏逻辑和渲染的线程。 该架构类似于Google网站上的LunarLander演示。

活动开始时,创buildsurfaceView并调用此方法:

@Override public void surfaceCreated(SurfaceHolder holder) { renderThread.start(); } 

当我按Homebutton退出游戏时,会调用onPause()方法,该方法调用surfaceDestroyed()。 在surfaceDestroyed我停止游戏线程通过调用:

  @Override public void surfaceDestroyed(SurfaceHolder holder) { synchronized(holder) { renderThread.stop(); } } 

该应用程序进入后台罚款。 然后,当我通过按下图标重新启动应用程序时,屏幕上出现“强制closures”popup窗口,在日志中显示“线程已启动”消息。 当活动在渲染线程上调用start()时,会进入“surfaceCreated”方法。

现在我已经仔细研究了几个小时,却不知道这是为什么。 我相信我的线程在closures应用程序时会停止,所以我不明白为什么它已经启动了。

Solutions Collecting From Web of "“线程已经启动”,当恢复活动"

这些方法不会做你认为他们做的事情。 从API文档 :

多次启动线程永远不合法。

和:

public final void stop() – 不推荐使用。 这种方法本质上是不安全的。

如果你想暂停一个线程,你必须在线程中使用Object.wait()Objecft.notifyAll()

在我看来,如果你打算经常启动和停止线程,那么你不应该把你的代码打包到线程的子类中(这些例子是因为它使得代码更短)。 改用Runnable。 这样,您可以在需要时停止并放弃旧的线程,并在需要重新启动时创build一个新的线程对象来执行Runnable。

 private TutorialRunnable tutorialRunnable; ... // Synchronization and error checking omitted for brevity. public void surfaceCreated(SurfaceHolder holder) { thread = new Thread(tutorialRunnable); thread.start(); } public void surfaceDestroyed(SurfaceHolder holder) { tutorialRunnable.setRunning(false); while (thread != null) { try { thread.join(); thread = null; } catch (InterruptedException e) { } } } 

另外,依靠例外是不好的forms。 当你自己的代码行为出乎意料时,这应该作为最后的手段。

不好的解决scheme,但它的工作

  public void surfaceCreated(SurfaceHolder holder) { try{ _thread.setRunning(true); _thread.start(); }catch(Exception ex){ _thread = new TutorialThread(getHolder(), this); _thread.start(); } } 

更正受到热烈的欢迎。