首先,对标题不是很描述感到抱歉。
我有以下代码无法正常工作(或按照我的意愿)。
即使我叫“ 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循环中,看看它们是否输出相同的值。