首先,对标题不是很描述感到抱歉。

我有以下代码无法正常工作(或按照我的意愿)。

即使我叫“ Cancel()”,这也会继续...

private boolean cancelled;

private synchronized Bitmap renderBitmap(PatchInputStream pis){
              File file = new File(Environment.getExternalStorageDirectory()+url);

              FileOutputStream fos=new FileOutputStream(file);
              byte buf[]=new byte[2000];
              int len;
              while((len=pis.read(buf))>0 && !isCancelled() ){
                  fos.write(buf,0,len);
              }
              fos.close();
              if (isCancelled()){
                cancelled=false;
                return null;
              }

              Bitmap bm = saveBitmapToFile(file);
              return bm;
}

public boolean isCancelled(){
    return cancelled;
}

public void Cancel(){
    cancelled=true;
}


此代码有什么问题?我想念什么吗?

最佳答案

至少该代码具有并发性错误,可以通过制作cancelled volatile来解决。否则,不能保证另一个线程看到新值。
(显然并非如此。)

另一种可能性是不调用cancel()方法。
(显然并非如此。)

还有一种可能是在另一个对象实例上调用cancel()方法。尝试将System.out.println(System.identityHashCode(this))添加到cancel()方法和while循环中,看看它们是否输出相同的值。

09-28 00:52