2012-07-29 5 views
1

나는 AsyncTask를 ProgressDialog와 함께 사용한다. 내 코드를 참조하십시오. onPostExecute에 문제가 있습니다. 작업이 처음 실행되는 경우 handleMessage의 progressDialog에 대해 Null Poiter 예외가 발생하지만 dismiss()를 호출하면 직접 작동합니다. onPostExecute에 도달하기 전에 전화를 켜면 progressDialog.dismiss()가 작동하지 않습니다. 핸들러가 항상 작동하지 않는 이유는 무엇입니까?안드로이드 : AsyncTask 핸들

public class UpdateTask extends AsyncTask<Void, Void, Void> { 
    private ProgressDialog progressDialog; 
    private Handler handler; 

public UpdateTask(Act activity) { 

     progressDialog = ProgressDialog.show(Activity.this, "Wait", 
       "Wait"); 
     progressDialog.dismiss(); 

     handler = new Handler(){ 
      @Override 
      public void handleMessage(Message msg) { 
       //run on UI Thread 
       switch(msg.what){ 
        case MSG:      
         progressDialog.show(); 
         break; 
        case DETACH: 
         progressDialog.dismiss(); 
         break; 
       } 
      } 
     }; 

    } 


    void detach() { 
      activity=null; 
        //problematic 
      //progressDialog.dismiss(); 
      //handler.sendEmptyMessage(DETACH); 
     } 




    @Override 
    protected Void doInBackground(Void... params) { 
     handler.sendEmptyMessage(MSG);; 
     return null; 
    } 

    protected void onPostExecute(Void result) { 
     if (activity==null) { 
      Log.w("RotationAsync", "onPostExecute() skipped -- no activity"); 
      } 
      else { 
       //problematic 
       //     progressDialog.dismiss(); 
       handler.sendEmptyMessage(MSG); 
       progressDialog = null; 
      } 
    } 

}; 

답변

2

AsyncTask 안에 처리기가 필요한 이유는 무엇입니까? 그러나 처리기를 사용하여 AsyncTask에서 진행 대화 상자를 제어하려는 경우 올바른 방법이지만 새 UpdateTask를 시작할 때마다 현재 Handler가 만들어지고 소멸됩니다. 같은 당신이 당신의 AsyncTask를 외부에서 핸들러를 정의하면, 뭔가 :

private Handler handler = new Handler(new Handler.Callback() { 
    @Override 
public boolean handleMessage(Message msg) { 

    switch(msg.what){ 
       case MSG:      
        progressDialog.show(); 
        break; 
       case DETACH: 
        progressDialog.dismiss(); 
        break; 
      } 

    return false; 
} 
}); 

이제 안전하게 어떤 배경 스레드에서 handler.sendEmptyMessage를 (무엇을)를 호출 할 수 있으며해서 ProgressDialog는 UI 스레드에서만 업데이트됩니다. 완전한 수정이 아니며 DETACH 및 MSG에 대해 정의한 int 값을 알 수 없습니다. 그러나 잘하면 도움이 될 것입니다. 이것은 백그라운드 작업에서 UI 요소를 업데이트하는 데 사용하는 방법입니다. AsyncTask와 UI 요소 업데이트에 대해 조금 더 읽어보십시오.

관련 문제