본문 바로가기
IT 개발

[Android 개발 팁] Thread와 Handler를 이용해 ProgressDialog띄우기

by 로보찌빠냥 2011. 2. 9.


안드로이드 개발중 ListView에 웹에서 가저오는 데이터 띄워주는 동안 동글뱅이 돌아가면서 '잠시만 기다려주세요'라는 메시지를 보여주려다 수십차례 삽질을 했습니다..

webview에서 로딩할 때는 간단하게 되는데 ListView에서 ProgressDialog를 사용하려니까 잘 안되더라구요.
뭐 삽질은 했지만 다른 분들에게 많은 도움을 받았기에 나와 같은 고민을 하고 있는 분이 혹시라도 있으면 조금이나마 도움이 되고자 포스트 합니다.

아래 WatingDialog 클래스로 만들어 봤습니다. 사용법은

WatingDialog waitingDialog = new WatingDialog(context);
waitingDialog.startWaitingDialog("대기 중 보여줄 메시지");

이렇게 WatingDialog 객체를 new해서 startWaitingDialog를 하면 다이얼로그가 보여집니다.
그리고 끝나는 시점에서 waitingDialog.dismissWaitingDialog();를 호출해주면 다이얼로그를 Dismiss할 수 있습니다.
ListView 같은 경우에는 Adapter 에서 getView메소드 마지막 view객체를 return하기 전에 불러주면 다이얼로그가 닫아집니다.

이렇게 만들려면 waitingDialog 객체를 클래스객체로 선언해야 하는데 더 좋은 방법이 있는지는 잘 모르겠습니다.
혹시 더 좋은 방법이나 잘못된 부분을 지적해 주시면 많은 도움이 되겠습니다~ 그럼^^;



public class WatingDialog{
 
 private Context mContext;
 private Handler prgressHandler = new Handler() {
  public void handleMessage(Message msg) {
   //특별히 msg에 대한 처리는 하지 않음.
   watingDialog.dismiss();
  }
 };
 ProgressDialog watingDialog;
 
 public WatingDialog(Context context)
 {
  mContext = context;
 }
 
 /**
  * < WaitingDialog 를 멈추기 위한 메서드. >
  *
  * @author [찌빠]
  */
 public void dismissWaitingDialog(){
  Message msg = prgressHandler.obtainMessage();
  prgressHandler.sendMessage(msg);
 }
 
 /**
  * < WaitingDialog에 Massege를 설정하고 다이어로그를 보여주는 메서드. >
  *
  * @param [msg] [Dialog 에 보여지는 내용]
  * @author [찌빠]
  */
 public void startWaitingDialog(final String msg){
  new Thread(){
      public void run(){
   Looper.prepare();
   watingDialog = (ProgressDialog) onCreateDialog(msg);
   watingDialog.setOnCancelListener(new android.content.DialogInterface.OnCancelListener() {
    @Override
    public void onCancel(DialogInterface dialog) {
     // 로딩 중에 뒤로가기 버튼이 눌렸을 때 현재 Activity를 finish 해준다.

     ((Activity) mContext).finish();
    }
   });

   watingDialog.show();
       Looper.loop();
      }
     }.start();
 }
 
 /**
  * < startWaitingDialog()시 Dialog를 생성하는 메서드 >
  *
  * @param [msg] [Dialog 에 보여지는 내용]
  * @return [Dialog를 반환함.]
  * @author [찌빠]
  */
 protected Dialog onCreateDialog(String msg) {

  ProgressDialog progressDialog = new ProgressDialog(mContext);
  progressDialog.setMessage(msg);
  progressDialog.setCancelable(true);
  
  return progressDialog;
 }
}

반응형

댓글