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