2012-02-02 6 views
0

게임 내에 시간 카운터를 삽입하고 싶습니다. 시간이 0이면 사용자에게 시간이 초과되었음을 알리고 이전 활동으로 돌아가는 AlertDialog가 있습니다.AlertDialog가있는 Looper.prepare()

public void showTime(){ 
    time--; 
    Log.i("GameView time", "" + time); 
    if (time <= 0){ 
     Log.i("gameview time","time out"); 
     gameTimer.setRunning(false); 
     AlertDialog.Builder alt_bld = new AlertDialog.Builder(this.getContext()); 
     AlertDialog alert = alt_bld.create(); 
     alert.setTitle("Time is out. You lose."); 
     alert.setButton("OK", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) { 
       main.onBackPressed(); 
      }}); 
     alert.show(); 
    } 
} 

GameTimer 클래스는 스레드입니다 : 다음은 방법이다 (그것은 서피스 뷰 SurfaceView를 확장하는 클래스 내부)

public class GameTimer extends Thread{ 

private GameView gameView; 
private boolean run; 

public GameTimer(GameView gameView){ 
    this.gameView = gameView; 
} 

public void setRunning(boolean value){ 
    this.run = value; 
} 

public void run(){ 
      Looper.prepare(); 
    while (run){ 
     try { 
      gameView.showTime(); 
      sleep(1000); 
     } catch (Exception e){ 
      e.printStackTrace(); 
     } 
    } 
      Looper.loop(); 
} 

}

가에 AlertDialog가 나타나지만 응용 프로그램 충돌 뷰 계층 구조를 만든 원래 스레드 만보기를 변경할 수 있습니다. 그러나 이것은 창조 한 실로 ... 문제는 어디에 있습니까?

답변

2

이 사용하는 핸들러를 수행하거나

this.runOnUiThread(new Runnable() { 

     public void run() { 
      // TODO Auto-generated method stub 

     } 
    }); 

오류 자체가 전체 이야기를 사용합니다. 그리고 Activity/View의 Parent 클래스에 있지 않은 경우 Mechnasim 콜백을 사용하십시오. 문제를 해결하는 데 도움이됩니다. 건배.

+0

이 시도했습니다 ... 불행하게도 아무것도 :( – MMMM

+1

스레드 http://developer.android.com/reference/android/os/Looper.html 내부 루퍼를 사용하는 방법을 여기에서 볼을 변경하지 않고이 보인다 당신의 GameTimer는 퍼펙트 한 퍼블릭 클래스이고, Activity의 내부 클래스가 아니기 때문에, runOnUiThread 나 Handler 어느 쪽도 작동하지 않습니다. 당신이 콜백을 구현한다고 말했죠. 당신은 지금 이해했습니다 – Yuvi

+0

고마워 :) 이제 괜찮아 – MMMM

1

오류가 발생하면 View 객체를 다른 곳의 Thread 클래스 생성자에 전달한 다음 AlertDialog를 만드는 방법을 사용하려고합니다. 불행히도 이것은 작동하지 않습니다. 처리기를 사용하여 스레드에서 showTime() 메서드를 정의한 View 클래스로 메시지 (경우에 따라 시간 = 0)를 되돌려 보내야합니다. 핸들러를 정의한 다음 handleMesage() 메서드를 재정 의하여 showTime() 메서드를 호출합니다.

아래 링크를 통해 도움을받을 수 있습니다. http://developer.android.com/reference/android/os/Handler.html