Java AsyncTask在取消时不取消
我有一个任务。在对话框片段的oncreate视图中,我正在创建asynctask的对象 如下所示(示例代码) 现在在onclick中,我正在执行异步takJava 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()){
@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;
}