【发布时间】:2012-06-18 12:25:16
【问题描述】:
所以我遇到了一个由大位图引起的臭名昭著的 oom 错误。但我已经设法解决了大部分问题。当我单击返回并关闭应用程序然后立即启动应用程序时,剩下的唯一问题发生了。然后应用程序将崩溃,给我一个 oom(内存不足)错误。如果我单击主页,则不会发生这种情况。
为什么会这样?我的猜测是 GC 还没有完成清理,现在我在旧数据仍然存在的时候启动它。当然,它不是一个新应用,所以旧版本和新版本的应用内存限制相同。
关于这个问题的任何意见和可能的解决方案都会很棒。
我尝试过的:
关于我使用过的所有位图下载:
BitmapFactory.Options op = new Options();
op.inPurgeable = true;
bmImg = BitmapFactory.decodeStream(is,null,op);
使图像的尺寸宽度 x 高度更小(以 kb 为单位的大小大致相同)。
错误日志片段:
06-25 04:29:28.917: E/AndroidRuntime(8819): Caused by: java.lang.OutOfMemoryError: bitmap size exceeds VM budget
06-25 04:29:28.917: E/AndroidRuntime(8819): at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
06-25 04:29:28.917: E/AndroidRuntime(8819): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:460)
06-25 04:29:28.917: E/AndroidRuntime(8819): at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:336)
06-25 04:29:28.917: E/AndroidRuntime(8819): at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:715)
06-25 04:29:28.917: E/AndroidRuntime(8819): at android.content.res.Resources.loadDrawable(Resources.java:1713)
06-25 04:29:28.917: E/AndroidRuntime(8819): at android.content.res.TypedArray.getDrawable(TypedArray.java:601)
06-25 04:29:28.917: E/AndroidRuntime(8819): at android.widget.ImageView.<init>(ImageView.java:122)
06-25 04:29:28.917: E/AndroidRuntime(8819): at android.widget.ImageView.<init>(ImageView.java:112)
06-25 04:29:28.917: E/AndroidRuntime(8819): ... 23 more
编辑: 所以有两件事为我解决了这个问题。
- 在我的主要活动的 ondestroy() 中清除我的数据库并将大图像设置为 null。
- 缩小大图像。
但这只是提出了同样的基本问题,如果调用 onDestroy(),为什么我的活动在打开新活动之前没有正确关闭?我还看到我的活动在关闭后很长一段时间内继续运行。这可能与问题有关吗?我该如何追查造成这种情况的原因?
Edit2:罪魁祸首似乎是我的 LruCache。我使用了一个未在 ondestroy() 中清除的静态 lrucache。当应用程序重新启动时,lrucache 中的所有图像仍然存在,这会导致问题。我仍然想知道为什么这只是重启时的问题?当我在关闭之前返回主要活动时,这难道不是一个问题吗?
【问题讨论】:
-
这可能是位图解码的大文件,所以你可以试试这个帖子的位图大文件解码解决方案:stackoverflow.com/questions/477572/…欢迎!
标签: android bitmap out-of-memory