7

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

但我无法正确处理。该错误将我指向surfaceCreated我开始线程的位置,告诉我线程已经开始。我尝试分别在resumeandsuspend上使用onResumeandonPause但没有任何改变。

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

提前致谢。

4

4 回答 4

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 将被创建并保存在本地,其中的变量即使在应用程序结束后仍然存在;
  • 如果您要管理超过 5-10 个变量,则使用 SQL 数据库,因为在这种情况下,使用前一个选项会很困难。
于 2011-08-16T08:30:44.937 回答
2

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

于 2011-08-15T18:19:58.480 回答
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()您的线程循环中,有一个布尔值“运行”,while(run)它将执行代码。当您将 run 更改为 false 时,线程退出。
  • 如果您的线程处于休眠状态(我认为它可能会因为它是一个游戏而运行,并且将运行 wrt 时间),抓住InterruptedException然后退出那里。当你想杀死线程时,你将异常抛出给线程。

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

于 2011-08-25T00:55:56.147 回答
1

在不知道代码的来龙去脉的情况下。

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

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

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

于 2011-08-25T11:41:17.223 回答