我想强制取消AsyncTask。我看到您可以使用isCancelled()之类的in this valid solution(引擎盖使用AtomicBoolean。
但我看到suspiciousSolution1,suspiciousSolution2,suspiciousSolution3等解决方案,其中引入了新的标记private boolean isTaskCancelled = false;
。
我开始想知道 - 因为那个标志在
中被修改了public void cancelTask(){
isTaskCancelled = true;
}
在某个线程上运行,并在
中读取protected Void doInBackground( Void... ignoredParams ) {
//Do some stuff
if (isTaskCancelled()){
return;
}
}
在WorkerThread中运行,然后标志isTaskCancelled
不应该是易变的(或AtomicBoolean,就像Google的实施一样)。
答案 0 :(得分:5)
是的,它应该是volatile
。否则,由于优化(通过编译器,JVM等),对线程A中的变量的写入可能对线程B中的读取不可见。见this
答案 1 :(得分:2)
试一下
<强>初始化强>
private AysncTask aysncTask;
任务调用
aysncTask=new AysncTask();
aysncTask.execute();
任务取消您想要的地方
if ( aysncTask != null && aysncTask.getStatus() == aysncTask.Status.RUNNING ){
aysncTask.cancel(true);
}
答案 2 :(得分:0)
是的,不稳定。考虑到你只是用它来定期检查你的asynctask。如果是多线程,我会建议使用原子字段。请在此处查看更多信息:volatile vs atomic&amp; Volatile boolean vs AtomicBoolean