2013-07-01 65 views
0

我有一個asynctasks。在對話片段的OnCreate觀點我創造我的AsyncTask 的對象像下面(示例代碼)的AsyncTask不取消取消

 @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { 

    cashInValidatorListner = new CashInValidatorListner(mSessionManager.getCustomerId(),mSessionManager.getPosId(), this); 
     } 

現在的onclick我正在執行異步TAKS我加入oncancellistner爲

@Override 
public void onClick(View v) { 
    if(v==ok) 
    { 
     if(mHomeActivity.mProgressDialog!=null && !mHomeActivity.mProgressDialog.isShowing()){ 
      mHomeActivity.mProgressDialog.show(); 
     } 
     cashInValidatorListner.execute(); 
    } 
    } 

這個進度

 @Override 
public void onCancel(DialogInterface dialog) { 

    if(dialog==mProgressDialog) 
    { 
     mDialogExtraOptions.cashInValidatorListner.cancel(true); 
     Toast.makeText(getBaseContext(), "Task Cancled", Toast.LENGTH_SHORT).show(); 
    } 
} 

我第一次取消異步任務上算再次執行它 它howerver取消給出錯誤說不能執行已經執行的任務。

,當我試圖在的onclick每次用戶點擊OK按鈕,問題就解決了 喜歡這個

 @Override 
public void onClick(View v) { 
    if(v==ok) 
    { 
     if(mHomeActivity.mProgressDialog!=null && !mHomeActivity.mProgressDialog.isShowing()){ 
      mHomeActivity.mProgressDialog.show(); 
     } 
      cashInValidatorListner = new CashInValidatorListner(mSessionManager.getCustomerId(),mSessionManager.getPosId(), this); 
     cashInValidatorListner.execute(); 
    } 
    } 

這工作正常創建對象,我的問題是,爲什麼當我運行的異步任務不執行第一次是第二次?

回答

2

你可能只能在實例的生命週期執行的AsyncTask一次。這可以通過簡單地創建Asynctask對象的新實例並執行新創建的對象來解決,就像您所做的那樣。

(new CashInValidatorListner(mSessionManager.getCustomerId(),mSessionManager.getPosId(), this)).execute(); 
+0

創建新實例在這裏是一個壞主意?我應該嘗試創建一個對象並嘗試取消一次? – Bora

+0

你可以在同一行上執行,而不是每次將它分配給一個變量 – frogmanx

0

引用形式的文檔。

任務只能執行一次(如果 第二試圖執行一個異常將被拋出。)

你會得到IllegalStateException異常Cannot execute task: the task is already running

AsyncTask實例只能使用一次。

檢查下線程規則的話題。

http://developer.android.com/reference/android/os/AsyncTask.html

要取消的AsyncTask調用cashInValidatorListner,cancel(true)

如果調用取消(真),中斷將被髮送到後臺線程,這可能有助於中斷任務。否則,您應該確保在doInBackground()方法中定期檢查isCancelled()。

protected Object doInBackground(Object... x) { 
    while (/* condition */) { 
     // work... 
     if (isCancelled()) break; 
    } 
    return null; 
} 

來源:Android - Cancel AsyncTask Forcefully

public final boolean cancel (boolean mayInterruptIfRunning)

試圖取消對此任務的執行。 如果任務已完成,已被取消或由於某些其他原因無法取消,此嘗試將失敗。如果成功,並且此任務在調用取消時尚未開始,則此任務不應運行。如果任務已經開始,則mayInterruptIfRunning參數確定執行此任務的線程是否應該中斷以試圖停止任務。

使用isCancelled()

public final boolean isCancelled()

返回true之前正常完成這個任務被取消。如果對任務調用cancel(boolean),則應該從doInBackground(Object [])中定期檢查此方法返回的值,以儘快結束任務。