我有一个使用SurfaceView实现来显示对象的游戏。
我有一个线程可以将SurfaceView定时绘制到屏幕上。
游戏完全正常运行。
不幸的是,只要游戏中断,就需要暂停功能。
好吧,我知道我需要操纵onResume
和onPause
。
但我无法做对。错误将我指回surfaceCreated
,我开始线程告诉我线程已经启动。我尝试分别使用resume
和suspend
上的onResume
和onPause
,但没有任何变化。
我怎样才能做到这一点? 我已经完成了如何使用File-I / O处理保存对象位置。
提前致谢。
答案 0 :(得分:3)
这就是我所做的:
@Override
public void surfaceCreated(SurfaceHolder arg0) {
if (thread.getState() == Thread.State.TERMINATED){
CreateThread(getHolder(),getContext());
}
thread.setRunning(true);
thread.start();
}
如果要正确使用onPause / onResume,请不要将线程使用的变量放入线程中(如LunarLander中所做)。我建议你这样做:
// Variables declarations
public MyGameThread CreateThread(...){
thread = new MyGameThread(holder, context, new Handler() {
// and so on....
});
}
当您通过onPause / onResume时,您的线程将被销毁并重新编译,但如果您将变量放在其外,则可以继续使用它们。
如果您需要保留重要内容,请使用以下选项之一:
答案 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时,线程将退出。InterruptedException
然后退出。当你想杀死线程时,你将异常抛给线程。第一个是迄今为止最简单的。
答案 3 :(得分:1)
不知道代码的来龙去脉。
要“暂停”一个线程,您可以实现如下功能:
while(! this.isInterrupted())
if(!paused)
{
... Do something ...
} else { try { Thread.sleep(100) } catch (InteruptedException ie) {} }
这取决于Do something
是否使您的表面视图无效或以其他方式控制应用中的进展。 paused
的访问者应该允许您暂停和恢复您的线程,而不会陷入任何其他架构。