2011-12-21 3 views
0

Я развиваю игру. Играя в игру, если пользователь нажимает кнопку возврата устройства, я должен приостановить поток и отобразить окно предупреждения, которое подтверждает, действительно ли пользователь хочет выйти или нет. Если пользователь хочет выйти из него просто выйдите из игры. Но проблема возникает, когда пользователь не хочет выходить. Затем мне нужно возобновить поток. но я не могу сделать that..given ниже мой фрагмент кода ..Как приостановить и возобновить поток в моем приложении?

   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() и рендер - это две функции, написанные в классе MyGamePanel.

я попробовал много вещей, но никто не working..please помочь мне ...

+0

, пожалуйста, помогите мне ... я застрял на этом .. –

ответ

1

Обычно лет не хотите использовать resume и suspend, потому что они могут оставить нить в неустойчивом состоянии. Лучший способ сделать то, что вы пытаетесь сделать, это с семафором:

  • Declare булеву где-то, что позволяет определить, будет ли игра приостановлена:

    Boolean paused; 
    
  • Проверьте это логическое значение в игровой цикл и ждать, если паузу:

    synchronized(paused) { 
        while(paused) { 
         wait(); 
        } 
    } 
    
  • включения и отключения приостановленной Boolean от основного потока:

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

Это схематичный код, который делает, например, не лечить исключения, но вы получите идею.

+0

На самом деле я запутался, когда мне нужно написать этот код ... synchronysed() function in thread..rt? Wat abt other one? How can i управляйте этим на заднем ключевом событии? Извините..и не так знакомы с потоками .. :( –

+0

Я попытался написать синхронизированную функцию в моей теме..бат делает ошибку..и dnt knw, где мне нужно написать, что фрагмент кода .. –

+0

'synchronized() {}' - это специальная Java-конструкция, а не вызов функции. Вы должны использовать ее внутри игрового цикла (в 'while (running) {...}'). выполнение достигает этой точки, поток остановится и дождитесь, пока 'paused' будет ложным. – gimix

-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 
} 

}

+0

просто замените этот код в потоке и пропустите эту строку кода из диалога. //GamePanel.thread.resume(); –

0

Я думаю, ваша проблема в вашем MyGamePanel.thread.resume();. Попробуйте удалить этот код и посмотреть, что произойдет.

Если вы считаете, что thread.resume() - это функция, которая вам нужна для разных целей (которую вы ограничены ее удалением), тогда покажите нам код функции thread.resume(), чтобы мы могли помочь вам исправить возобновить функциональный код.

Смежные вопросы