2012-07-29 41 views
1

我將AsyncTask與ProgressDialog結合使用。 看我的代碼,我在onPostExecute有問題。 如果任務第一次運行,它會爲handleMessage中的progressDialog獲取一個空指針異常,但直接調用dismiss()將會起作用。 在到達onPostExecute之前打開手機時,progressDialog.dismiss()不起作用。爲什麼處理程序不總是工作?Android:AsyncTask的Handler

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內的Handler?但是,如果您想使用Handler控制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元素即可。