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