要强制取消AsyncTask,在doInBackground中定期检查的标志不应该是易失性的吗?



我想强制取消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

相关内容

最新更新