1

在我的 Android 应用程序中,我有一个功能可以从 ImageView 和 TextView 获取位图,然后将其保存到 SDCard。在函数结束时,我当前在位图对象上调用 recycle(),在 ImageView 上调用 destroyDrawingCache(),如下所示:

b1.recycle();
bitmap.recycle();
imgView.destroyDrawingCache();

b1 和 bitmap 是 Bitmap 对象,它们是局部变量。imgView 是一个 ImageView 对象,它是一个字段。imgView 在应用程序运行时经常被重新创建。包含这三行代码是否是一个好主意,性能和内存方面?或者垃圾收集器会自动完成这项工作,以便包含它们只会减慢应用程序的速度,因为它必须进行三个方法调用?

4

1 回答 1

2

从文档中引用

http://developer.android.com/training/displaying-bitmaps/manage-memory.html

在 Android 2.3.3(API 级别 10)及更低版本上,建议使用 recycle()。如果您在应用程序中显示大量位图数据,您可能会遇到 OutOfMemoryError 错误。recycle() 方法允许应用程序尽快回收内存。

Android 3.0(API 级别 11)引入了 BitmapFactory.Options.inBitmap 字段。如果设置了此选项,则采用 Options 对象的解码方法将在加载内容时尝试重用现有位图。这意味着位图的内存被重用,从而提高了性能,并消除了内存分配和取消分配。在蜂窝和更高版本中,位图像素数据在堆上分配。所以在这种情况下你不需要调用回收。当 gc 启动时,它将释放为位图分配的内存。

它是垃圾收集器释放内存的工作。当它需要回收内存时,垃圾收集器就会启动。GC deos 标记和清除。你可以查看logcat。

您可以看到暂停时间。更大的堆更频繁地 gc 启动和更频繁的暂停时间。

 GC_CONCURRENT freed <1K, 14% free 21220K/24455K, paused 6ms+26ms
 GC_CONCURRENT : Jumps in because Heap is full
 14% free 21220K/24455K After this collection 14% of memory is free. Check the heap usage.
 paused 6ms+26ms Time taken to collect garbage.

有一个关于这个话题的演讲@https ://www.youtube.com/watch?v=_CruQY55HOk

于 2013-05-29T19:24:07.210 回答