안드로이드 개발 질문/답변
(글 수 45,052)
package dialogtest.com; import java.util.Timer; import java.util.TimerTask; import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.os.Bundle; public class dialogtest extends Activity { int t = 0; Timer timer; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); /*AlertDialog.Builder adb = new AlertDialog.Builder(dialogtest.this); adb.setCancelable(false); adb.setTitle("에러"); adb.setMessage("서버 접속 실패"); adb.setPositiveButton("OK", new OnClickListener() { public void onClick(DialogInterface dialog, int which) { finish(); } }); adb.show();*/ timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { ++t; if(t == 10) { timer.cancel(); AlertDialog.Builder adb = new AlertDialog.Builder(dialogtest.this); adb.setCancelable(false); adb.setTitle("에러"); adb.setMessage("서버 접속 실패"); adb.setPositiveButton("OK", new OnClickListener() { public void onClick(DialogInterface dialog, int which) { finish(); } }); adb.show(); } } }, 0, 500); } }
타이머로 일정 시간이 지나면 다이얼로그 창이 뜨게 할려고 하는데
다이얼로그 창이 뜨지 않습니다.
타이머말고 그냥 액티비티에 넣으면 (주석처리 된 부분) 다이얼로그가 잘 뜨는데
원인이 무엇인지 가르침 부탁드립니다.
2010.02.27 00:00:57
그 방법을 해봤습니다. 하지만 디버깅 결과 관련이 없더군요.
timer.cancel()가 호출 되어도 해당 메서드를 빠져 나갈 때까지
나머지 코드를 실행 하였습니다.
timer.cancel()가 호출 되어도 해당 메서드를 빠져 나갈 때까지
나머지 코드를 실행 하였습니다.
2010.02.28 16:42:23
몇 가지 재미있는 사실이 발견되었습니다. 제가 확인해 보니 adb.show() API 호출 다음에 로그를 한번 찍어보면, 해당 로그가 찍히지 않네요. adb.show() 호출 자체에서 Exception 이 발생 하거나, 무한 루프에 빠지는 경우일텐데, 디버깅 창에서 Thread 를 살펴보니, Timer Thread 가 바로 사라집니다. 즉, Exception 이 발생하는데 그걸 누군가가 Catch 하고 있다는 뜻으로 보입니다. 어떤 종류의 Exception 인가 궁금해서 Timer 대신 Thread 를 이용해 dialog 를 show 해보았습니다.
02-28 07:27:44.755: ERROR/AndroidRuntime(640): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
라고 예외가 발생하더군요. Timer 도 결국 하나의 Thread 이니, 아마 유사한 예외상황이 발생하는게 아닐까 생각해 봅니다. 제 생각으로는 Looper API들을 잘 이용해서 어떻게 Dialog 를 표시할 수 있는 방법이 있을지도 모르겠지만, 그냥 Main Looper 에 Handler 를 하나 다시고, timer 에서는 해당 Handler 에 Message 를 보내는 형태로 구현하시는게 손쉽지 않을까 생각합니다.
timer.cancel()이 실행되면서 타이머가 이미 해제되어 버려서 그 아래는 실행이 안될것 같네요...