我从用户那里得到了很多这些例外:java.lang.OutOfMemoryError:位图大小超过VM预算 - 但我无法在模拟器上重现该问题。
我正在使用它作为我的ImageDownloader http://code.google.com/p/android-imagedownloader/source/browse/trunk/src/com/example/android/imagedownloader/ImageDownloader.java#185,当尝试解码图像时,问题出现在第185行。
关于此错误,stackoverflow还有很多其他问题,但没有一个适合我的具体情况。这个问题的解决方案可以起作用:https://stackoverflow.com/a/823966但我似乎无法让它发挥作用。
以下是我在ImageDownloader中更改的内容:
final HttpEntity entity = response.getEntity();
if (entity != null) {
InputStream inputStream = null;
try {
inputStream = entity.getContent();
// return BitmapFactory.decodeStream(inputStream);
// Bug on slow connections, fixed in future release.
FlushedInputStream flushedStream = new FlushedInputStream(inputStream);
// Decode image size
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
BitmapFactory.decodeStream(flushedStream, null, o);
Log.d(LOG_TAG, "decodeStream - outWidth=" + o.outWidth + " outHeight=" + o.outHeight);
// The new size we want to scale to
final int REQUIRED_SIZE = 70;
// 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;
return BitmapFactory.decodeStream(flushedStream, null, o2);
} finally {
if (inputStream != null) {
inputStream.close();
}
entity.consumeContent();
}
}
第二次调用decodeStream()时失败。错误是 SkImageDecoder :: Factory返回null 。我想可能inputStream在第二次调用时关闭或不可用,所以我尝试在上面的第一行使用BufferedHttpEntity,但没有运气。
有人可以引导我走向正确的方向吗?感谢。
答案 0 :(得分:0)
首先检查一次下载多少图像。它消耗了多少内存在大多数Android手机中最大堆内存为16MB,当你不需要任何资源时,只需定时释放(null),就不会让堆内存增长,也不会发生内存泄漏问题。这是高内存应用程序(如使用多媒体)的常见问题之一。因此,您需要做的就是检查未使用的资源,并且将来也不会使用它们并使它们为空(例如位图),因此它将释放内存。
答案 1 :(得分:0)
使用BitmapFactory.Options应该做的事情。如果你要忘记内存,请尝试通过删除变量来清除内存。
你在//解码图像大小或//使用inSampleSize解码
时,你在哪里获得“SkImageDecoder :: Factory返回null”答案 2 :(得分:0)
首先下载图像并放入一个字节数组。在使用输入流一段时间后,decodeStream
会返回null
。