所以我有一个由大位图引起的臭名昭着的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(),为什么在打开新活动之前我的活动没有正确关闭?此外,我看到我的活动在关闭后继续运行很长时间。这可能与这个问题有关吗?如何找出原因?
Edit2 :culprint似乎是我的LruCache。我使用静态lrucache,它不会在ondestroy()中清除。当应用程序重新启动时,lrucache中的所有图像仍然存在,这会导致问题。我仍然想知道为什么这只是重启时的问题?在我关闭它之前回到主要活动时,这不应该是一个问题吗?
答案 0 :(得分:2)
我有同样的问题,这是通过强制关闭流程解决的。这可以通过覆盖onDestroy()来完成。使用此:
@Override
public void onDestroy(){
ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo> pids = am.getRunningAppProcesses();
for (int i = 0; i < pids.size(); i++) {
ActivityManager.RunningAppProcessInfo info = pids.get(i);
if (info.processName.equalsIgnoreCase(context.getPackageName())) {
android.os.Process.killProcess(info.pid);
}
}
super.onDestroy();
}
答案 1 :(得分:1)
嘿,请在同一问题上查看我的答案:bitmap size exceeds Vm budget error android
并且在处理这样的位图时也总是尝试使用最大选项:
final Options options = new Options();
options.outHeight = (int) scaleHeight; // new smaller height
options.outWidth = (int) scaleWidth; // new smaller width
options.inScaled = true;
options.inPurgeable = true;
// to scale the image to 1/8
options.inSampleSize = 8;
bitmap = BitmapFactory.decodeFile(imagePath, options);
这可能会解决您的问题。
答案 2 :(得分:0)
culprint似乎是我的LruCache。我使用静态lrucache,它不会在ondestroy()中清除。当应用程序重新启动时,lrucache中的所有图像仍然存在,这会导致问题。我仍然想知道为什么这只是重启时的问题?在我关闭它之前回到主要活动时,这不应该是一个问题吗?
尽管如此,我对此问题的临时/永久修复是清除ondestroy()中的所有静态引用,还要使用较小尺寸的图像。这似乎解决了我所有的问题,因为我也找不到任何内存泄漏。