android - 在创建位图后调用 recycle() 和 destroyDrawingCache() 是个好主意吗?

标签 android performance bitmap garbage-collection

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

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

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

最佳答案

引用文档

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 对象的解码方法将在加载内容时尝试重用现有位图。这意味着位图的内存被重用,从而提高了性能,并消除了内存分配和取消分配。 在 honeycomb 和更高版本中,位图像素数据分配在堆上。所以在这种情况下你不需要调用回收。当 gc 启动时,它将释放为位图分配的内存。

释放内存是垃圾收集器的工作。当它需要回收内存时,垃圾收集器就会启动。GC deos mark and sweep。你可以检查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 有一个关于这个话题的演讲

关于android - 在创建位图后调用 recycle() 和 destroyDrawingCache() 是个好主意吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16822180/

相关文章:

android - 添加 Android Jetpack Compose 导航库后,实现 ViewModelProvider.Factory 失败,继承自具有 '@JvmDefault' 的接口(interface)

performance - 做 HTTP 基准测试后如何计算平均情况

android - 如何在android中将图标转换为位图?

android - Android 上的覆盖屏幕

android - 为图库中的元素设置布局参数

java - 拍照后不调用 onActivityResult

javascript - 使用 Object.create(null) 创建空对象的影响和好处

c++ - vector<bool> 和数组之间的性能差距

c++ - OpenGL,这是绘制文本的最佳方式吗?

c# - 最适合模型的位图类