如何暂停和恢复我的应用程序中的线程?

时间:2011-12-21 08:27:35

标签: android multithreading resume

我正在开发游戏。在玩游戏的同时,如果用户按下设备后退按钮,我必须暂停线程并显示警告框,它确认用户是否真的要退出。如果用户想要退出它只是退出游戏。但是当用户不想退出时出现问题。然后我必须恢复线程。但我不能这样做。以下是我的代码片段..

             public boolean onKeyDown(int keyCode, KeyEvent event) {
     if (keyCode == KeyEvent.KEYCODE_BACK) {

         MyGamePanel.thread.setRunning(false);
         AlertDialog alertDialog = new AlertDialog.Builder(this).create();
            alertDialog.setTitle("Exit Alert");
                        alertDialog.setMessage("Do you really want to exit the Game?");
            alertDialog.setButton("Yes", new DialogInterface.OnClickListener() {
              public void onClick(DialogInterface dialog, int which) {
                 finish();
                 return;
            } }); 
            alertDialog.setButton2("No", new DialogInterface.OnClickListener() {
              public void onClick(DialogInterface dialog, int which) {
                  dialog.cancel();
                      MyGamePanel.thread.resume();
                      MyGamePanel.thread.setRunning(true);
                return;
            }}); 
             alertDialog.show();

         return true;
     }
     return super.onKeyDown(keyCode, event);
 }

以下给出的是线程部分。

       @Override
public void run() {
    Canvas canvas;
    Log.d(TAG, "Starting game loop");

    while (running) {
        canvas = null;
        try {
            canvas = this.surfaceHolder.lockCanvas();
            synchronized (surfaceHolder) {
                // update game state 
                this.gamePanel.update();
                // render state to the screen
                // draws the canvas on the panel
                this.gamePanel.render(canvas);  


            }
        } finally {
            // in case of an exception the surface is not left in 
            // an inconsistent state
            if (canvas != null) {
                surfaceHolder.unlockCanvasAndPost(canvas);
            }
        }   // end finally
    }
}

update()和render是在MyGamePanel类中编写的两个函数。

我尝试了很多东西,但没有一个正常工作。请帮助我...

3 个答案:

答案 0 :(得分:1)

通常你不想使用resumesuspend,因为它们会使线程处于不一致状态。做你想做的事情的最好方法是使用信号量:

  • 在某处声明一个布尔值,让您指定游戏是否暂停:

    Boolean paused;
    
  • 在游戏循环中检查此布尔值并等待暂停:

    synchronized(paused) {
        while(paused) {
            wait();
        }
    }
    
  • 从主线程设置和取消设置暂停的布尔值:

    public void setPaused(boolean wantToPause) {
        synchronized(paused) {
            paused = wantToPause;
            notify();
        }
    }
    

这是示意图代码,例如,它不会处理异常,但您会明白这一点。

答案 1 :(得分:0)

我认为您的问题出在MyGamePanel.thread.resume();。尝试删除该代码,看看会发生什么。

如果您认为thread.resume()是您为不同目的所需的功能(您只能删除它),那么请向我们展示thread.resume()函数代码,以便我们可以尝试帮助您修复简历功能代码。

答案 2 :(得分:-1)

我有同样的问题,但我发现解决方案只是在线程中替换此代码。

while (true) {
if(running){
Log.d("running", "true");
    canvas = null;
    try {
        canvas = this.surfaceHolder.lockCanvas();
        synchronized (surfaceHolder) {
            // update game state 
            this.gamePanel.update();
            // render state to the screen
            // draws the canvas on the panel
            this.gamePanel.render(canvas);  


        }
    } finally {
        // in case of an exception the surface is not left in 
        // an inconsistent state
        if (canvas != null) {
            surfaceHolder.unlockCanvasAndPost(canvas);
        }`enter code here`
    }   // end finally
}

}