AsyncTask在取消时不取消

时间:2013-07-01 10:44:05

标签: java android android-asynctask

我有一个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();
    }
}

第一次取消异步任务时,它会在再次执行时被取消 它给出了错误,说无法执行已执行的任务。

当我尝试在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();
    }
    }

这里工作正常,我的问题为什么在我第一次运行它时第二次运行异步任务时没有执行?

2 个答案:

答案 0 :(得分:2)

您只能在实例的生命周期中执行一次Asynctask。这可以通过简单地创建Asynctask对象的新实例并执行新创建的对象来解决,就像您所做的那样。

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

答案 1 :(得分:0)

引用文档。

  

任务只能执行一次(如果是,则会抛出异常   尝试第二次执行。)

您将获得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 - Cancel AsyncTask Forcefully

public final boolean cancel (boolean mayInterruptIfRunning)

尝试取消执行此任务。 如果任务已完成,已取消或由于其他原因无法取消,则此尝试将失败。如果成功,并且在调用cancel时此任务尚未启动,则此任务永远不会运行。如果任务已经启动,则mayInterruptIfRunning参数确定执行此任务的线程是否应该在尝试停止任务时被中断。

使用isCancelled()

public final boolean isCancelled ()

如果此任务在正常完成之前被取消,则返回true。如果在任务上调用cancel(boolean),则应该从doInBackground(Object [])定期检查此方法返回的值,以便尽快结束任务。