Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在onResume/onPause中重新启动/暂停线程_Android_Multithreading_Surfaceview_Onresume_Onpause - Fatal编程技术网

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

Android 在onResume/onPause中重新启动/暂停线程,android,multithreading,surfaceview,onresume,onpause,Android,Multithreading,Surfaceview,Onresume,Onpause,我有一个使用SurfaceView实现来显示对象的游戏。 我有一个线程,它会将SurfaceView一次又一次地绘制到屏幕上。 游戏正在进行中。 不幸的是,它需要有一个暂停功能,每当游戏被中断。 嗯,我知道我需要操作onResume和onPause 但我不能把它弄对。错误将我指向surfaceCreated,我在那里启动线程,告诉我线程已经启动。我试着分别在onResume和onPause上使用resume和suspend,但没有改变 我怎样才能做到这一点? 我已经完成了如何使用文件I/O处理保

我有一个使用SurfaceView实现来显示对象的游戏。 我有一个线程,它会将SurfaceView一次又一次地绘制到屏幕上。 游戏正在进行中。 不幸的是,它需要有一个暂停功能,每当游戏被中断。 嗯,我知道我需要操作
onResume
onPause

但我不能把它弄对。错误将我指向
surfaceCreated
,我在那里启动线程,告诉我线程已经启动。我试着分别在
onResume
onPause
上使用
resume
suspend
,但没有改变

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


提前感谢。

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

我就是这么做的:

    @Override
    public void surfaceCreated(SurfaceHolder arg0) {
           if (thread.getState() == Thread.State.TERMINATED){
              CreateThread(getHolder(),getContext());
           }
           thread.setRunning(true);
           thread.start();
    }
  • 在CreateThread中,您应该有thread=newmythread(…)
  • setRunning(booleanmrun)使用一个boolean来启动/停止run函数(我想我是受LunarLander的启发)
如果要正确使用onPause/onResume,请不要将线程使用的变量放在线程内部(如在LunarLander中所做的)。我建议你这样做:

// Variables declarations

public MyGameThread CreateThread(...){
thread = new MyGameThread(holder, context, new Handler() {
// and so on....
});
}
当您通过onPause/onResume时,您的线程将被销毁和更新,但是如果您将变量放在它之外,您可以在之后继续使用它们

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

  • SharedReferences:将创建一个xml并在本地保存,其中包含即使在应用程序结束后仍然存在的变量
  • 如果要管理5-10个以上的变量,则需要SQL db,因为在这种情况下,使用前一个选项会很困难

    • 我不确定这个问题中是否有一个或两个线程,我假设有两个。在呼叫暂停时,您需要做三件事:

      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是你的问题。您想中断线程并告诉它退出,否则当您调用暂停时,您的线程仍在执行其任务。然后,当您回到游戏中时,线程将再次尝试创建,从而导致问题。有两种方法可以正确终止线程:

      • 在线程的
        while()。当您将run更改为false时,线程将退出
      • 如果您的线程处于休眠状态(我认为可能是因为它是一个游戏,将运行w.r.t time),捕获
        InterruptedException
        ,然后退出。当您想要终止线程时,您会向线程抛出异常

      第一个是最简单的。

      不知道代码的来龙去脉

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

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

      这取决于
      是否执行某些操作
      会使您的surface view无效或控制应用程序的进度。
      paused
      的访问器应该允许您暂停和恢复线程,而不会陷入任何其他体系结构中。

      好吧,那么,当我从
      onPause
      @Cyril Horad将运行标志设置为false时,如何重新启动线程运行,您的应用程序将只启动具有相同任务的另一个线程启动另一个线程?但这不是要从一开始就开始任务吗?@Cyril Horad,你应该保存恢复工作所需的所有信息,当然任务将从头开始,恢复工作取决于你。我明白了。但是,从捆绑包/文件恢复工作不会浪费时间吗?可能是重复的,可以进一步扩展吗?我没法通过这条路进去。很抱歉回复太晚。好吧,开始研究这个博客吧:我得到了很多关于“lunarlander问题”的信息。然后,带着一个详细的问题回来;)