所以我遭遇了因大型位图引起的臭名昭著的oom错误。但我已经成功解决了大部分问题。唯一剩下的问题是,当我点击返回并关闭应用程序,然后立即启动应用程序时,应用程序将崩溃并显示oom(内存不足)错误。如果我点击主页,则不会发生这种情况。
为什么会出现这种情况?我的猜测是GC没有完成清理工作,现在我启动它时旧数据还在那里。当然,这不是一个新应用程序,所以旧启动和新启动都在同一个应用程序内存限制下运行。
对于此问题和可能的解决方案,任何输入都将是很好的。
我尝试过的:
对于所有位图下载,我使用了:
使图像在宽度 x 高度方面的尺寸更小(大约相同大小的 kb)。<--这解决了该问题,所以我有一个备用解决方案,除非有人有超级解决方案 :)
错误日志片段:
为什么会出现这种情况?我的猜测是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()被调用,为什么我的活动没有在新活动打开之前正确关闭?我发现我的活动在关闭后仍然持续运行很长时间。这是否与该问题有关?我如何找出其原因?
编辑2:罪魁祸首似乎是我的LruCache。我使用一个静态lrucache,在ondestroy()中没有清除它。当应用程序重新启动时,lrucache中的所有图像仍然存在,这会导致问题。我仍然想知道为什么这只是在重新启动时才成为问题?在我关闭主要活动之前返回时,这不也应该是一个问题吗?