2011-12-22 3 views
0

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

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

     MainGamePanel.thread.setRunning(false); 

     AlertDialog alertDialog = new AlertDialog.Builder(this).create(); 
      alertDialog.setTitle("Exit Alert"); 
      // alertDialog.setIcon(R.drawable.appicon); 

      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) { 


        if(mainscreenOn) 
        { 
         dialog.cancel(); 
        } 
        else 
        { 
         dialog.cancel(); 
         GamePanel.thread.setRunning(true); 
         GamePanel.thread.run(); 
        } 


       return; 
      }}); 
      alertDialog.show(); 

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

если mainscreenOn флаг установлен, то диалоговое окно предупреждения становится cancelled..but проблема возникает, если это false.can кто-нибудь помочь мне, пожалуйста ... я застрял на этом ...

я стало известно, что это не проблема диалога оповещения ... это проблема моей игры thread..given ниже мой код игры нить ..

public class GameThread extends Thread { 

private static final String TAG = GameThread.class.getSimpleName(); 

// Surface holder that can access the physical surface 
private SurfaceHolder surfaceHolder; 
// The actual view that handles inputs 
// and draws to the surface 
private MainGamePanel gamePanel; 


// flag to hold game state 
public boolean running; 
public void setRunning(boolean running) { 
    this.running = running; 
} 

public GameThread(SurfaceHolder surfaceHolder, MainGamePanel gamePanel) { 
    super(); 
    this.surfaceHolder = surfaceHolder; 
    this.gamePanel = gamePanel; 
} 



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

    while (running) { 

     Log.v(""," ->Inside Thread!" + running); 
     canvas = null; 
     // try locking the canvas for exclusive pixel editing 
     // in the surface 
     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 
    } 
} 



} 

, когда я отладки кода управления собирается к этому коду и застрял здесь.

ответ

0

Я тестировал код без GamePanel заявления, его прекрасно работать как для mainscreenOn равным истинны и flase.

Я думаю, в вашем случае его не возвращался из onClick() когда mainScreenOn ложно, означает его strucking в GamePanel.thread.setRunning() или GanePanel.thread.run().


Проверьте эту ссылку, это может вам помочь. о паузе и возобновлении потока.

How to pause/resume thread in Android


Вы звоните run() после setRunning(true). Я думаю, если ваш поток имеет объект Runnable, тогда вам нужно позвонить только run(). как показано ниже

Thread t = new Thread(new Runnable() { 
     public void run() { 
      // your task 
     } 
}); 

Если вы не используете Runnable объект, я думаю, нет необходимости вызывать run(). так или иначе вы управляете потоком с переменной running.

Пожалуйста, проверьте это, я тоже не уверен в этом.

+0

Я знаю, что это проблема вызова потока отсюда .. но я не знаю, как это исправить ... –

+0

Я думал, что вы не знаю этой причины, извините, я не могу помочь вам решить вашу проблему. bye –

+0

если я не звоню run() methoed, то как я могу это назвать? Я пробовал только с setRunning (true) statement.but, но он не работает. –

0

, вы должны вызвать функцию отклонения() диалогового окна вместо cancel().

dialog.dismiss(); 

попробовать это один

+0

нерабочий .... –

0

Для каждого условия вы отменяя dialog.So Я думаю, что вы не должны проверить cancelling.You может сделать это следующим образом.

alertDialog.setButton2("No", new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int which) { 
         dialog.dismiss(); 
         if(!mainscreenOn) 
         { 
          GamePanel.thread.setRunning(true); 
          GamePanel.thread.run(); 
         } 


        return; 
       }}); 

Отредактировано:

Тогда попробуйте с положительным Баттоном и отрицательный Button.If он не работает, то проверьте точку, которая упоминается в «Yugandhar баба».

AlertDialog.Builder builder = new AlertDialog.Builder(this);; 
       builder.setMessage("Are you sure you want to exit?") 
         .setCancelable(false) 
         .setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
          public void onClick(DialogInterface dialog, int id) { 
           finish(); 
          } 
         }) 
         .setNegativeButton("No", new DialogInterface.OnClickListener() { 
          public void onClick(DialogInterface dialog, int id) { 
           dialog.cancel(); 
          } 
         }); 
       AlertDialog alert = builder.create(); 
       alert.show(); 
+0

Я пробовал это..было бесполезно ... все же диалог предупреждения не отменяется –

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