加载位图时内存不足错误

我有一个Android应用程序与3 acitivtys:

A1 – 开始 – > A2 – 开始 – > A3 – 完成他的过程:开始 – > A1

(所以我不完成();“一个应用程序,我开始下一个活动与”startActivity(..);“用户交互后的整个时间)

所以在这三个活动中有一个循环。 在每个活动,我显示3-9张图片,位于SD卡,我加载我的以下function:

try { Uri selectedImageURI = Uri.parse(strImagePath); File imgFile = new File(getRealPathFromURI(selectedImageURI, c)); Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath()); ivTmp.setImageBitmap(myBitmap); }catch (Exception e) { return null; } 

这一切工作。 但有时(通过我的活动循环几次后),我的应用程序崩溃..

Logcat告诉我:

 01-16 13:42:15.863: DEBUG/dalvikvm(23161): GC_BEFORE_OOM freed 10K, 9% free 59019K/64400K, paused 29ms, total 30ms 01-16 13:42:15.863: ERROR/dalvikvm-heap(23161): Out of memory on a 8018704-byte allocation. 01-16 13:42:15.863: ERROR/AndroidRuntime(23161): FATAL EXCEPTION: main java.lang.OutOfMemoryError at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method) at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:502) at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:355) at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:785) at android.content.res.Resources.loadDrawable(Resources.java:1965) at android.content.res.Resources.getDrawable(Resources.java:660) at android.widget.ImageView.resolveUri(ImageView.java:616) at android.widget.ImageView.setImageResource(ImageView.java:349) at <MyApp>.MyActivity$6.run(MyActivity.java:143) at android.os.Handler.handleCallback(Handler.java:725) at android.os.Handler.dispatchMessage(Handler.java:92) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:5039) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) at dalvik.system.NativeStart.main(Native Method) 

有人可以给我一些提示如何处理崩溃? 也许是因为我的活动设置为状态“暂停”,而不是正确closures它们?

Solutions Collecting From Web of "加载位图时内存不足错误"

为了快速修复,你可以添加

你的清单应用程序标签中的android:largeHeap="true"

链接在这里:

我在桌面上点燃了OOM问题

 Heap size (large) android:largeHeap="true" 

这里提到了使用更大的堆链接的规范:

编辑:使用caching位图技术链接在这里

在显示高分辨率图像时,我遇到了类似的问题。 我已经search并应用了http://developer.android.com/training/displaying-bitmaps/index.html中给出的所有android位图解决scheme,并在链接中caching了mekanism&#x3002; 但他们都没有工作。 没有任何正确的解决scheme。 然后我发现问题是:我不能使用可绘制的文件夹结构。 我在mdpi和hdpi文件夹中保留高分辨率的图像。 这导致android放大图像到超大尺寸。 由于android监视器/内存部分,100 kb图像导致内存增加20 mb。 所以我已经将这些超分辨率的图像添加到xxhdpi文件夹,然后突然被固定。 那么我的图像滑块完美无瑕

是的,android并不会立即销毁用户不可见的活动,但是有许多生命周期方法是根据当前状态调用的。 查看http://developer.android.com/guide/components/activities.html#Lifecycle

您可以尝试完成onStop()或onDestroy()中的活动,因为当活动不可见时以及系统分别在内存不足时调用这些活动。 🙂

这是由于图像的高分辨率,您必须使用以下代码来缩放位图

  Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath()); int h = 100; // height in pixels int w = 100; // width in pixels Bitmap photoBitMap = Bitmap.createScaledBitmap(myBitmap,h, w, true); ivTmp.setImageBitmap(photoBitMap);