2011-08-17 56 views
4

我遇到了AsyncTask的一些小問題。AsyncTask按下後退按鈕時的任務

我把它實現如下

private class MakeConnection extends AsyncTask<String, Void, String> implements OnDismissListener{ 

    Context context; 
    ProgressDialog myDialog; 
    public MakeConnection(Context conetext) 
    { 
     this.context = conetext; 
     myDialog = new ProgressDialog(this.context); 
     myDialog.setCancelable(true); 
     myDialog.setOnDismissListener(this); 
    } 

    @Override 
    protected String doInBackground(String... urls) { 
     //do stuff 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     try { 
      myDialog.dismiss(); 
      success(result); 
     }catch(JSONException e) 
     { 
      data = e.toString(); 
     } 
    } 

    @Override 
     protected void onProgressUpdate(Void... values) { 
      myDialog = ProgressDialog.show(context, "Please wait...", "Loading the data", true); 
     } 

    @Override 
    public void onDismiss(DialogInterface dialog) { 

     this.cancel(true); 
    } 
} 

但是當過我按後退按鈕沒有任何反應,只是完成了任務,因爲如果我不按後退按鈕

知道爲什麼?

回答

12

有此問題的兩個部分:

1)實現你doInBackground()以這樣的方式,所以它會檢查是否AsyncTask被取消。

@Override 
protected String doInBackground(String... urls) { 
     for(int i = 0; i < 100 && !isCancelled(); i++) { 
      //do some stuff 
     } 
} 

2)你應該叫你活動的onDestroy()asynTask.cancel(true)

+0

我現在有一個關於這個問題,我已經實現了你建議,但我想知道是必須捕獲主UI線程中的後退按鈕事件還是僅在AsyncTask onDesmiss方法中捕獲?因爲當我連接速度很慢時,我可以用當前實現取消AsyncTask – Armand

+0

您應該在Activity的onDestroy()中取消「AsyncTask」。當任務被取消時,'onPostExecute()'不會被調用。在你的情況下,任務會停留一段時間,但是完成後,調用'AsyncTask.onCancelled()'(當然,你可以重寫它)。你只應該在這個函數中小心(或者不要觸及'onCancelled()')中的UI,因爲它可以在Activity已經被銷燬之後被調用。 – inazaruk

+0

好吧,如果我將活動打開一段時間,然後屏幕鎖定,然後解鎖並繼續使用它,並嘗試使用AsyncTask啓動一個新活動,它只是打開我的對話框而沒有其他任何事情發生,爲什麼? – Armand

4

這解決了我的問題

@Override 
protected void onPreExecute(){ 
    myDialog = ProgressDialog.show(
      context, 
      "Please wait...", 
      "Loading the data", 
      true, 
      true, 
      new DialogInterface.OnCancelListener(){ 
       @Override 
       public void onCancel(DialogInterface dialog) { 
        MakeConnection.this.cancel(true); 
       } 
      } 
    ); 
} 
1

,也可以使用follwing方法在活動

@Override 
public void onBackPressed() { 
    // TODO Auto-generated method stub 
    super.onBackPressed(); 
    imageLoadingAsyncTask.cancel(true); 
}