Android - 加载位图时内存不足

Android - Out of memory while loading bitmaps

我有 3 个活动,当我从 2 切换到 3 时,我的应用程序就像重新启动一样跳转到 1。

我将位图从 activity 拖到另一个位图。

怎么办?我应该使用什么技巧来减少内存?

02-02 06:29:20.017    1509-1509/marty.martzero D/dalvikvm﹕ GC_FOR_ALLOC freed 508K, 6% free 21312K/22663K, paused 29ms, total 29ms
02-02 06:29:20.027    1509-1509/marty.martzero E/io﹕ bitmaptosave = xz
02-02 06:29:20.586    1526-1526/marty.martzero D/dalvikvm﹕ GC_FOR_ALLOC freed 69K, 4% free 8003K/8259K, paused 28ms, total 29ms
02-02 06:29:20.606    1526-1526/marty.martzero I/dalvikvm-heap﹕ Grow heap (frag case) to 10.228MB for 2479056-byte allocation
02-02 06:29:20.656    1526-1528/marty.martzero D/dalvikvm﹕ GC_CONCURRENT freed <1K, 3% free 10424K/10695K, paused 15ms+10ms, total 54ms
02-02 06:29:20.857    1526-1528/marty.martzero D/dalvikvm﹕ GC_CONCURRENT freed 1K, 2% free 11189K/11335K, paused 16ms+3ms, total 56ms
02-02 06:29:20.937    1526-1526/marty.martzero D/libEGL﹕ loaded /system/lib/egl/libEGL_emulation.so
02-02 06:29:20.947    1526-1526/marty.martzero D/﹕ HostConnection::get() New Host Connection established 0x2a0fcf60, tid 1526

您可以将位图 public 设为静态,然后在另一个 activity 中使用它。用activity.

就不用拖了

还有另一种压缩位图以减少内存大小的方法

BitmapFactory.Option imageOpts = new BitmapFactory.Options ();
imageOpts.inSampleSize = 2;   // for 1/2 the image to be loaded
Bitmap thumb = Bitmap.createScaledBitmap (BitmapFactory.decodeFile(photoPath, imageOpts), 96, 96, false);

首先要知道位图在移动应用程序中是邪恶的。如果它们没有得到有效使用,它们会占用大量 RAM。以下方法可能有助于更好的内存管理:

  • 使用单例来保存您的位图。
  • 但是,请注意 android 中的内存泄漏,请参阅 this
  • 请勿重新创建已加载到内存中的位图。例如,当您仍然持有对原始版本位图的引用时,不要重新创建缩放版本的位图。如果您需要不同大小的单个位图,请使用矩阵操作,而不是每次都调整位图本身的大小。

这样做:

canvas.drawBitmap(bitmap, srcRect, dstRec1, null);
canvas.drawBitmap(bitmap, srcRect, dstRec2, null);
canvas.drawBitmap(bitmap, srcRect, dstRec3, null);

不是这个:

canvas.drawBitmap( bitmap1,  left1, top1, null);
canvas.drawBitmap( bitmap2,  left2, top2, null);
canvas.drawBitmap( bitmap3,  left3, top3, null);

其中 bitmap1、bitmap2 和 bitmap3 是同一个文件,只是缩放比例不同。

  • 尝试加载尽可能小的位图。阅读有关采样的更多详细信息 here.

  • 最后,如果您的应用程序确实需要较大的堆大小,您可以通过在清单应用程序部分中设置标志来请求更大的堆:

    android:largeHeap="true"