android.view.WindowLeaked 문제에 대한 해결책..

진저브레드(안드로이드 2.3) 부터는 태스크를 처리하는 형태로 AsyncTask를 사용하도록 가이드 하고 있다. 이 클래스를 사용하다 보면, 자주는 아니지만 가끔 android.view.WindowLeaked 에러를 발생시킨다. 이런 경우에 이 클래스(AsyncTask)를 생성해서 실행시킨 Activity가 onPuase()나 onClose() 상태가 되면서 finish되는 상태가 되고, 이 상태에서 AsyncTask의 결과를 처리하는 스레드(UI 스레드)가 아직 실행 중인 상태에서 발생한다. 즉, Context 객체를 AsyncTask에서 사용하는 중에 Context 객체가 종료돼서 발생한다. 그래서, 간단한 해결책을 살펴보자.

Dialog 클래스 류의 작업을 보통 AsyncTask로 많이 구동시키는데..

1. Dialog를 클래스 변수로 선언을 한다.

private ProgressDialog dialog;
private Dialog d;

2. 별도 쓰레드에서 클래스 변수를 인스턴스화해서 사용하자.

dialog = ProgressDialogFactory.create(AAAActivity.this, false);

3. Activity의 onPause나 onClose같은 상황이 되서 Activity가 finish되는 상황에서 dialog를 종료해 주자.

if (dialog != null && dialog.isShowing()) {
  dialog.dismiss();
  dialog = null;
}
  
if(d != null && d.isShowing()) {
  d.dismiss();
  d = null;
}

finish();

위 형태로 Dialog를 사용하면 android.view.WindowLeaked 문제는 쉽게 해결된다. ^^

답글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.