簡體   English   中英

AsyncTask在取消時不取消

[英]AsyncTask do not cancel on cancelling

我有一個asynctasks。 在對話框片段的oncreate視圖中,我正在創建我的asynctask的對象,如下所示(示例代碼)

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

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

現在在onclick我正在執行async taks

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

我為此進度條添加了oncancellistner

       @Override
public void onCancel(DialogInterface dialog) {

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

第一次取消異步任務時,它會在再次執行時取消howerver,它會顯示錯誤,表示無法執行已執行的任務。

當我嘗試在onclick上創建對象時,每次用戶單擊確定按鈕時,問題就解決了

        @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();
    }
    }

這里工作正常,我的問題為什么在我第一次運行它時第二次運行異步任務時沒有執行?

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

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

引用形式的文檔。

該任務只能執行一次(如果嘗試第二次執行,則會拋出異常。)

您將獲得IllegalStateException Cannot execute task: the task is already running

AsyncTask實例只能使用一次。

檢查線程規則下的主題。

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

要取消asynctask調用cashInValidatorListner,cancel(true)

如果調用cancel(true),則會向后台線程發送一個中斷,這可能有助於中斷任務。 否則,您應該確保在doInBackground()方法中定期檢查isCancelled()。

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

來源: Android - 強力取消AsyncTask

public final boolean cancel (boolean mayInterruptIfRunning)

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

使用isCancelled()

public final boolean isCancelled ()

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM