使用Android中的SurfaceView和Thread正确暂停onPause()和onResume()线程

时间:2012-12-23 18:20:46

标签: java android surfaceview onresume onpause

要运行我在Android上创建的游戏,我一直在使用GamePanel包含方法onDraw()和onTouch()。我也一直在使用GameThread类,它反复调用onDraw()和update()。

我的活动实例化GamePanel,我的GamePanel实例化GameThread。

我的onPause()只是将线程内的while循环中的条件设置为false。我的onResume()过去只是设置为等于true,但每次我尝试恢复应用程序时都会给我一个强制关闭错误(参见编辑#1 )。

因此,为了解决问题,我只是重新实例化了线程,

thread = new GameThread(getHolder(), this);

这解决了问题的一部分,允许我最小化应用程序,然后重新打开它没有问题。但是,当我在应用程序中并锁定手机然后解锁它(打开和关闭屏幕)时,线程永远不会启动。这只是我的游戏处于冻结状态。

我知道我对这个问题的解决方案非常时髦,我很想学习一种更为公认和干净的方法来完成这一切。

这是代码(我遗漏了一些似乎不相关的行):

GameActivity:

void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    gamePanel = new MainGamePanel(this);
    setContentView(gamePanel);

}
protected void onPause() {
    super.onPause();
    gamePanel.shutDown();

}
protected void onResume() {
    super.onResume();
    gamePanel.startUp();
}

的GamePanel

public MainGamePanel(Context context) {
    super(context);
    getHolder().addCallback(this);                  //adding the callback (this) to the surface  holder to intercept events
    thread = new GameThread(getHolder(), this);     // create the game loop thread
    setFocusable(true);                             // make the GamePanel focusable so it can handle events
}
public void startUp() {
    thread = new GameThread(getHolder(), this);
}

public void shutDown() {
    thread.setRunning(false);
}

GameThread

public GameThread(SurfaceHolder surfaceHolder, MainGamePanel gameView) {
    this.surfaceHolder = surfaceHolder;
    this.gameView = gameView;
    this.run = true;
}
public void setRunning(boolean run) {
    this.run = run;
}
public void run() {
    Canvas c;//
    while (run) {
        c = null;
        try {
            c = surfaceHolder.lockCanvas(null);
            synchronized (surfaceHolder) {                  
                gameView.update();
                gameView.onDraw(c);
            }
        } finally {
            if (c != null) {
                surfaceHolder.unlockCanvasAndPost(c);
            }
        }
    }
}

如果您需要更多信息或如何让我的问题更清晰,请告诉我(同样,我是否以可理解的庄园展示我的代码?)。

一点点帮助将会有很长的路要走。如果您能提出任何建议,请提前致谢。

- 编辑#1 -

当我关闭力量时,这是我的日志猫错误。

12-23 14:01:34.288: E/AndroidRuntime(9484): java.lang.IllegalThreadStateException: Thread already started.

- 编辑#2 -

我尝试了你所说的并将我的run()方法改为:

@Override
public void run() {
    Canvas c;
    while (true) {
        if (run) {/* run game thread */
            c = null;
            try {
                c = surfaceHolder.lockCanvas(null);
                synchronized (surfaceHolder) {
                    gameView.update();
                    gameView.onDraw(c);
                }
            } finally {
                if (c != null) {
                    surfaceHolder.unlockCanvasAndPost(c);
                }
            }
        } else {
            try {
                Thread.sleep(100);
            } catch (Exception e) {
            }
        }
    }
}

当我锁定手机时它起了作用,但是当我最小化应用程序并重新打开它时,我看到了一个黑屏,几秒钟后弹出“MyApp没有响应。”你要关闭它吗? ”。我检查了它到达的位置,它似乎到达onPause()和shutDown(),但它从未进入onResume();.此外,有时甚至在调用onPause()或shutDown()之后调用update(),这很奇怪。 (从LogCat获得信息)

0 个答案:

没有答案