在onResume / onPause中重新启动/暂停线程

时间:2011-08-15 17:40:36

标签: android multithreading surfaceview onresume onpause

我有一个使用SurfaceView实现来显示对象的游戏。 我有一个线程可以将SurfaceView定时绘制到屏幕上。 游戏完全正常运行。 不幸的是,只要游戏中断,就需要暂停功能。 好吧,我知道我需要操纵onResumeonPause

但我无法做对。错误将我指回surfaceCreated,我开始线程告诉我线程已经启动。我尝试分别使用resumesuspend上的onResumeonPause,但没有任何变化。

我怎样才能做到这一点? 我已经完成了如何使用File-I / O处理保存对象位置。

提前致谢。

4 个答案:

答案 0 :(得分:3)

这就是我所做的:

    @Override
    public void surfaceCreated(SurfaceHolder arg0) {
           if (thread.getState() == Thread.State.TERMINATED){
              CreateThread(getHolder(),getContext());
           }
           thread.setRunning(true);
           thread.start();
    }
  • 在CreateThread中,您应该拥有thread = new MyThread(...);
  • setRunning(boolean mRun)使用布尔值来启动/停止运行功能(我想我受到了LunarLander的启发);

如果要正确使用onPause / onResume,请不要将线程使用的变量放入线程中(如LunarLander中所做)。我建议你这样做:

// Variables declarations

public MyGameThread CreateThread(...){
thread = new MyGameThread(holder, context, new Handler() {
// and so on....
});
}

当您通过onPause / onResume时,您的线程将被销毁并重新编译,但如果您将变量放在其外,则可以继续使用它们。

如果您需要保留重要内容,请使用以下选项之一:

  • SharedPreferences:将创建一个xml并使用在应用程序结束后仍然存在的变量进行本地保存;
  • 一个SQL数据库,如果您管理的变量超过5-10个,因为在这种情况下使用前一个选项会很困难。

答案 1 :(得分:2)

实际上不建议您自己停止某个帖子,不建议使用stop()方法。最简单的解决方案是在线程的while方法中的run()循环中使用标志。当你需要“停止”线程时,你只需将标志丢弃为false,线程将不再执行任何操作,尽管它会继续运行。 Android会在需要时停止你的线程。希望这会有所帮助。

答案 2 :(得分:1)

我不确定你是否在这个问题中有一两个线程,我假设2.当你打电话给onPause时你需要做三件事:

1 - Save the state of the application (all game variables, states, etc)
2 - Kill the surfaceView by calling suspend.
3 - Kill the other thread (we'll call it Thread B).

我认为杀死线程B是你的问题。你想要中断线程并告诉它退出,否则当你调用onPause时你的线程仍然会做它的事情。然后,当你回到游戏中时,线程会再次尝试创建,这会导致问题。有两种方法可以正确杀死一个线程:

  • 在你的线程的while()循环中,有一个布尔'run',while(run)将执行代码。当您将run更改为false时,线程将退出。
  • 如果你的线程在睡觉(我认为它可能会在游戏中运行并且将在w.r.t时间运行),请抓住InterruptedException然后退出。当你想杀死线程时,你将异常抛给线程。

第一个是迄今为止最简单的。

答案 3 :(得分:1)

不知道代码的来龙去脉。

要“暂停”一个线程,您可以实现如下功能:

while(! this.isInterrupted())
    if(!paused)
    {
        ... Do something ...
    } else { try { Thread.sleep(100) } catch (InteruptedException ie) {} }

这取决于Do something是否使您的表面视图无效或以其他方式控制应用中的进展。 paused的访问者应该允许您暂停和恢复您的线程,而不会陷入任何其他架构。