Java AsyncTask在取消时不取消

Java AsyncTask在取消时不取消,java,android,android-asynctask,Java,Android,Android Asynctask,我有一个任务。在对话框片段的oncreate视图中,我正在创建asynctask的对象 如下所示(示例代码) 现在在onclick中,我正在执行异步tak @Override public void onClick(View v) { if(v==ok) { if(mHomeActivity.mProgressDialog!=null && !mHomeActivity.mProgressDialog.isShowing()){

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

现在在onclick中,我正在执行异步tak

  @Override
public void onClick(View v) {
    if(v==ok)
     {
         if(mHomeActivity.mProgressDialog!=null && !mHomeActivity.mProgressDialog.isShowing()){
            mHomeActivity.mProgressDialog.show();
        }
         cashInValidatorListner.execute();
    }
    }
我为这个进度条添加了一个Cancellistner

       @Override
public void onCancel(DialogInterface dialog) {

    if(dialog==mProgressDialog)
    { 
        mDialogExtraOptions.cashInValidatorListner.cancel(true);
        Toast.makeText(getBaseContext(), "Task Cancled", Toast.LENGTH_SHORT).show();
    }
}
我第一次取消异步任务时,它会在再次执行时被取消 它给出了一个错误,表示无法执行已经执行的任务

当我尝试在每次用户单击ok按钮时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对象的新实例并执行新创建的对象来解决,就像您所做的那样

 (new CashInValidatorListner(mSessionManager.getCustomerId(),mSessionManager.getPosId(), this)).execute();
从文件中引用

该任务只能执行一次(如果 尝试第二次执行。)

您将获得IllegalStateException
无法执行任务:任务已在运行

AsyncTask
实例只能使用一次

检查线程规则下的主题

要取消asynctask调用,请取消(true)

如果调用cancel(true),将向后台线程发送一个中断,这可能有助于中断任务。否则,只需确保在doInBackground()方法中定期检查isCancelled()

资料来源:

public final boolean cancel(boolean可能中断frunning)

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

使用isCancelled()

取消公共最终布尔值()


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

在这里创建新实例是个坏主意吗?我应该尝试只创建一个对象,然后尝试取消一次?您可以在同一行上执行,而不是每次都将其分配给变量
 (new CashInValidatorListner(mSessionManager.getCustomerId(),mSessionManager.getPosId(), this)).execute();
protected Object doInBackground(Object... x) {
    while (/* condition */) {
      // work...
      if (isCancelled()) break;
    }
    return null;
 }