【问题标题】:Out of Memory Error while loading bitmaps加载位图时出现内存不足错误
【发布时间】:2012-12-30 19:23:50
【问题描述】:

我有一个具有 3 个活动的 android 应用程序:

A1 --开始--> A2 --开始--> A3 --当完成他的过程时:开始--> A1

(所以我不会“finish();”一个应用程序。我在用户交互后的整个时间内都使用“startActivity(..);”开始下一个活动)

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

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)

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

【问题讨论】:

  • 尝试在 OnPause() 中对位图调用 .recycle()。并将它们加载到 onResume() 而不是 onCreate() 中。
  • 是否有可能以更好的方式做到这一点?比如,如果我所有的位图都位于一个线性布局中,那么调用 llMain.recycle() 或类似的东西?
  • 您可以创建一个 ArrayList ,您可以在其中添加您加载的每个位图并循环通过该位图。另一个普遍的事情:使用图像的样本大小。不知道您的应用程序是做什么用的,但大多数时候只是在屏幕上显示位图,对它们进行采样并节省内存就足够了。请参阅:developer.android.com/training/displaying-bitmaps/…
  • 我也遇到过这个问题,我使用How to resolve outofmemory Error ?。我想它会对你有所帮助。
  • 是否有机会从图像按钮中获取位图?

标签: android bitmap out-of-memory


【解决方案1】:

您可以添加快速修复

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

link here:

我在 kindle 和 nook 的桌子上遇到 OOM 问题

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

这里提到了使用更大的堆link here:

编辑:使用缓存位图技术link here

【讨论】:

  • 这个解决方案不会防止内存不足的异常,它只是允许使用更多的内存
  • @AlexKucherenko 是的,因为我提到了它的快速修复。
  • @PadmaKumar 这不是“修复”,它不能解决问题。
【解决方案2】:

我在显示高分辨率图像时遇到了类似的问题。我已经搜索并应用了http://developer.android.com/training/displaying-bitmaps/index.html 中给出的所有 android 位图解决方案,以下缓存了链接中的机制。但它们都不起作用。任何地方都没有任何正确的解决方案。然后我发现问题是:我无法正确使用可绘制文件夹结构。我将高分辨率图像保存在 mdpi 和 hdpi 文件夹中。这导致android将图像放大到超大尺寸。由于 android 监视器/内存部分,100 kb 图像导致内存增加 20 mb。 所以我将这些超分辨率图像添加到 xxhdpi 文件夹中,然后它突然被修复了。然后我的图像滑块完美地工作

【讨论】:

    【解决方案3】:

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

    您可以尝试在 onStop() 或 onDestroy() 中完成活动,因为它们将分别在活动不可见和系统内存不足时调用。 :-)

    【讨论】:

    • 我试图完成活动,但结果,我返回了一个活动.. 示例:我在 A3 上并想去 A1:我调用 startIntent(A1) 并完成 --> 我在A2.. :/
    • 好的,所以我认为如果您为每个活动覆盖 onStop() 并将 finish() 放在应该完成该活动并释放资源的方法中,而不是系统在下一次将其保存在内存中活动已经开始。确保 finish() 没有终止当前活动。
    【解决方案4】:

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

     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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-11
      相关资源
      最近更新 更多