我想强制取消AsyncTask。我看到你可以像在这个有效的解决方案中使用isCancel()一样(在引擎盖下使用原子布尔值。
但是我看到了像可疑解决方案1,可疑解决方案2,可疑解决方案3这样的解决方案,其中引入了新的标志private boolean isTaskCancelled = false;
。
我开始想知道 - 因为该标志在
public void cancelTask(){
isTaskCancelled = true;
}
在某个线程上运行,并在
protected Void doInBackground( Void... ignoredParams ) {
//Do some stuff
if (isTaskCancelled()){
return;
}
}
在WorkerThread中运行,那么标志不应该isTaskCancelled
易失性(或Google实现中的AtomicBoolean)。
是的,它应该是volatile
的。否则,由于优化(通过编译器、JVM 等),对线程 A 中的变量的写入可能对线程 B 中的读取不可见。看到这里
试试这个
初始化
private AysncTask aysncTask;
任务调用
aysncTask=new AysncTask();
aysncTask.execute();
任务在您想要的位置取消
if ( aysncTask != null && aysncTask.getStatus() == aysncTask.Status.RUNNING ){
aysncTask.cancel(true);
}
是的,易变。考虑到您只是使用它来定期检查您的异步任务。如果是多个线程,我建议使用原子字段。请在此处查看更多信息:volatile vs atomic&volatile boolean vs AtomicBoolean