问问题
1649 次
3 回答
1
我认为问题出在 doInBackground 方法中的 BitmapFactory 上。这种解码会消耗大量内存并且还存在一些已知的泄漏。我总是缩放它以减少内存消耗,而不是解码整个图像。有一个例子:
//decodes image and scales it to reduce memory consumption
private static Bitmap decodeImage(InputStream in, InputStream in2){
//Decode image size
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
BitmapFactory.decodeStream(in,null,o);
//The new size we want to scale to
final int REQUIRED_SIZE=100;
//Find the correct scale value. It should be the power of 2.
int scale=1;
while(o.outWidth/scale/2>=REQUIRED_SIZE && o.outHeight/scale/2>=REQUIRED_SIZE)
scale*=2;
//Decode with inSampleSize
BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inSampleSize=scale;
o2s.inTempStorage = new byte[16*1024];
return BitmapFactory.decodeStream(in2, null, o2);
}
注意:您需要打开两个输入流实例。
其他建议是每次图像不再有用时调用 Bitmap 中的 clear() 方法。
我希望这可以帮助你!
于 2012-10-01T10:24:57.187 回答
0
尝试将您的任务设置为:
DownloadBitmapTask task = new DownloadBitmapTask(context,image,
holder.cellProgress);
位图下载完成时为空。您没有关闭/处置在 AsyncTask 中分配的所有资源,并且 GC 无法释放它们。
于 2012-10-01T10:49:46.900 回答
0
我认为您应该在每次打开时关闭输入流,如下所示。
InputStream iStream = null;
try{
URLConnection conn = (new URL(args[0])).openConnection();
iStream = conn.getInputStream();
itmap = BitmapFactory.decodeStream(iStream);
done = true;
}catch(IOException ex){
failedTries++;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
}
} finally {
if(iStream != null)
iStream.close();
}
注意:-建议在使用后关闭任何流。
于 2012-10-01T10:44:59.927 回答