Android - 加载位图时内存不足

时间:2015-02-02 06:59:17

标签: android memory android-activity bitmap

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

我将位图从活动拖到另一个。

怎么办?我应该使用更少的记忆?

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

2 个答案:

答案 0 :(得分:0)

您可以将位图设为公共和静态,并在其他活动中使用它。没有必要拖动活动。

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

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

答案 1 :(得分:0)

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

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

这样做:

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

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

    机器人:largeHeap =&#34;真&#34;