0

我有一个异步任务。在对话框片段的 oncreate 视图中,我正在创建我的 asynctask 的对象,如下所示(示例代码)

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

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

现在在 onclick 我正在执行异步任务

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

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

4

2 回答 2

2

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

 (new CashInValidatorListner(mSessionManager.getCustomerId(),mSessionManager.getPosId(), this)).execute();
于 2013-07-01T10:49:11.693 回答
0

从文档中引用。

该任务只能执行一次(如果尝试第二次执行将引发异常。)

你会得到 IllegalStateException Cannot execute task: the task is already running

AsyncTask实例只能使用一次。

检查线程规则下的主题。

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

取消异步任务调用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)

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

使用 isCancelled()

public final boolean isCancelled ()

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

于 2013-07-01T10:59:22.883 回答