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

时间:2016-07-15 09:32:52

标签: android multithreading android-asynctask synchronized volatile

我想强制取消AsyncTask。我看到您可以使用isCancelled()之类的in this valid solution(引擎盖使用AtomicBoolean

但我看到suspiciousSolution1suspiciousSolution2suspiciousSolution3等解决方案,其中引入了新的标记private boolean isTaskCancelled = false;

我开始想知道 - 因为那个标志在

中被修改了
public void cancelTask(){
   isTaskCancelled = true;
}

在某个线程上运行,并在

中读取
protected Void doInBackground( Void... ignoredParams ) {
    //Do some stuff
    if (isTaskCancelled()){
        return;
    }
}

WorkerThread中运行,然后标志isTaskCancelled不应该是易变的(或AtomicBoolean,就像Google的实施一样)。

3 个答案:

答案 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