【问题标题】:Android - Out of memory while loading bitmapsAndroid - 加载位图时内存不足
【发布时间】:2015-02-02 06:59:17
【问题描述】:

我有 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

【问题讨论】:

  • 请发布您的加载位图代码

标签: android memory android-activity bitmap


【解决方案1】:

首先,要知道位图在移动应用程序中是邪恶的。如果没有有效使用,它们会占用大量 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"

【讨论】:

  • 不客气!如果这是您要查找的内容,请将答案标记为已接受。干杯!
【解决方案2】:

您可以将您的位图设为公开和静态,并在其他活动中使用它。无需随活动拖动。

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

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

【讨论】:

    猜你喜欢
    • 2012-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-21
    • 2013-05-08
    • 2013-08-25
    • 1970-01-01
    相关资源
    最近更新 更多