我使用以下代码将图像加载到ListActivity中的行。
URL url = new URL(drink.getImageUri());
InputStream fis = url.openStream();
//Decode image size
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
BitmapFactory.decodeStream(fis, null, o);
int scale = 1;
if (o.outHeight > imageMaxSize || o.outWidth > imageMaxSize) {
scale = (int) Math.pow(2, (int) Math.round(Math.log((imageMaxSize / (double) Math.max(o.outHeight, o.outWidth)) / Math.log(0.5))));
}
fis.close();
fis = url.openStream();
//Decode with inSampleSize
BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inSampleSize = scale;
bitmap = BitmapFactory.decodeStream(fis, null, o2);
fis.close();
imageMaxSize是screenHeight / 7所以每张图片应该相当小。
我在上面的代码中做错了吗?我得到的所有错误都在第二行,我尝试实际加载位图。
提前致谢 罗兰
答案 0 :(得分:0)
我认为这里的关键是你在列表行上这样做。当你完成它们以清理内存时,你需要回收你的位图。这可能不会在您的代码的第一次迭代中发生,但由于您没有使用Bitmap.recycle()回收内存,最终会耗尽内存并获得“Bitmap超出VM预算”
答案 1 :(得分:0)
接受答案的更好答案。
基本上有时因为舍入Math.round(等)会使比例回到1。
1表示即使图像太大也没有缩放。
我在alogirthm之后做了一个简单的检查。
if (o.outHeight > imageMaxSize || o.outWidth > imageMaxSize) {
scale = (int) Math.pow(2, (int) Math.round(Math.log((imageMaxSize / (double) Math.max(o.outHeight, o.outWidth)) / Math.log(0.5))));
// We already checked it was larger than acceptable so we know we at
// least need to scale down one step
if (scale == 1) {
scale = 2;
}
}
答案 2 :(得分:-2)
上面代码的问题包括以下块:
if (o.outHeight > imageMaxSize || o.outWidth > imageMaxSize) {
scale = (int) Math.pow(2, (int) Math.round(Math.log((imageMaxSize / (double) Math.max(o.outHeight, o.outWidth)) / Math.log(0.5))));
}
它根本不起作用。 WillyTates关于尝试增加缩放比例的评论使我检查了计算结果并且它总是返回1.
现在,当我修复它以便得到4或8的比例时,它的工作效果要好得多,而且我无法得到错误。
由于 罗兰