2013-06-20 23 views
0

我有一個活動,當開始時立即調用服務器查詢。以下是它的代碼。在AsyncTask中調用對話框拋出令牌錯誤

現在假設它開始AsyncTask,我在onSuccess中得到響應。在我得到迴應之前,如果我非常活躍,我按下後退按鈕。

現在回調仍然會被調用,並顯示對話框會引發壞的令牌異常。無法添加窗口令牌,您的活動是否正在運行。我怎樣才能中斷這個AsyncTask i-e如果我按回執按鈕執行onSuccess停止執行?

ResponseCallback callback = new ResponseCallback() 
{ 
    @SuppressWarnings("deprecation") 
    @Override 
    public void onSuccess(String response) 
    { 


      dialog = new AlertDialog.Builder(Chat.this).setMessage("BLABLA") 
      .setTitle("Invite!") 
      .setCancelable(true) 
      .setPositiveButton(android.R.string.ok, 
      new DialogInterface.OnClickListener() 
      { 
       public void onClick(DialogInterface dialog, int whichButton) 
       { 
         dialog.cancel(); 
         sendInvite(); 
       } 
      }) 
      .setNegativeButton(android.R.string.cancel, 
      new DialogInterface.OnClickListener() 
      { 
       public void onClick(DialogInterface dialog, int whichButton) 
       { 
         dialog.cancel(); 
       } 
      }) 
      .show(); 
     } 
     else 
     { 

    } 

    @Override 
    public void onFailure(String exception) 
    {} 
}; 

new MyAsyncTask(queryString, callback); 
+0

你有沒有嘗試重寫'onBackPressed()'和''AsyncTask'上調用'cancel()'? – codeMagic

+0

有,我有,還做了同樣的\t如果(的AsyncTask!= NULL)\t \t \t \t asyncTask.cancel(真); –

+0

您可以將.show()包裝在「try/catch」中。這應該防止它顯示,如果'活動'是關閉 – codeMagic

回答

0

您不能取消任務,因爲doBackground()已被執行。 你必須給自己編碼一張支票。例如,您可以將activityDestroyed布爾型字段添加到AsyncTask,初始化爲false。在您的活動調用onDestroy()中將其設置爲true。然後,您可以檢查之前的狀態以顯示或不顯示對話框。

if (!activityDestroyed) { 
    dialog = new AlertDialog.Builder(Chat.this).setMessage("BLABLA") 
      .setTitle("Invite!") 
      .setCancelable(true) 
      .setPositiveButton(android.R.string.ok, 
      new DialogInterface.OnClickListener() 
      { 
       public void onClick(DialogInterface dialog, int whichButton) 
       { 
         dialog.cancel(); 
         sendInvite(); 
       } 
      }) 
      .setNegativeButton(android.R.string.cancel, 
      new DialogInterface.OnClickListener() 
      { 
       public void onClick(DialogInterface dialog, int whichButton) 
       { 
         dialog.cancel(); 
       } 
      }) 
      .show(); 
} 

編輯:你應該能夠AsyncTask.cancel()AsyncTask.isCancelled()

0

我在後面發現了一個類似的問題。解決這個問題的一個簡單方法,然後在設置一定的變量設置爲true在onBackPressed()

@Override 
public void onBackPressed() { 
    isFinishing = true; 
    finish(); 
} 

onSuccess你只需要檢查,如果isFinishing是真實的。

編輯:您還可以使用:

if(Chat.this.isFinishing()) 

onSuccess,但我不知道這是否會只要你撥打finish()返回true。

0

即使你回去吧,任務仍在執行,以實現通過一個更合適的方式。我想正確的方法是中止與服務器的http連接。

您可以讓AsyncTask實現一個接口,例如:OnTaskCanceledListener使用單一方法:onTaskCanceled()。 的onTaskCanceled()的實施應該是這樣的(僞):

@Override 
public void onTaskCanceled(){ 
    httpRequest.abort(); 
} 

現在,回到以前的活動時,呼籲從AsyncTaskonTaskCanceled()回調。 這樣,你不應該通過onSuccess()

相關問題