【发布时间】:2011-02-14 16:20:45
【问题描述】:
我有一个应用程序运行大量(约 100 个)位图 - 即音乐封面艺术。位图有两种使用方式 - 作为大背景和小 (50dip) 图标。 将两种尺寸作为单独的位图预加载和缓存是否有意义? 我已经实现了这两种方法(使用大位图作为图标|缓存两种尺寸),但我看不到实际的性能差异。 这种情况的最佳做法是什么?
【问题讨论】:
标签: android caching bitmap drawable
我有一个应用程序运行大量(约 100 个)位图 - 即音乐封面艺术。位图有两种使用方式 - 作为大背景和小 (50dip) 图标。 将两种尺寸作为单独的位图预加载和缓存是否有意义? 我已经实现了这两种方法(使用大位图作为图标|缓存两种尺寸),但我看不到实际的性能差异。 这种情况的最佳做法是什么?
【问题讨论】:
标签: android caching bitmap drawable
缓存两种尺寸的图像没有意义,它占用了太多内存。
最佳做法是(以我的拙见):
catch(Exception e) 子句不会捕获它。【讨论】:
SoftReference!这是我错过的重要一点。
就个人而言,我会尽我所能限制我在内存中保留的位图数量。如果图标作为较大位图的缩小副本看起来不错,我会赞成这种方法。由于我的个人经验,这可能是一个有偏见的观点,但我在使用 Android 时遇到的最大问题是使用位图时内存不足
【讨论】:
不能同时保存两个文件,保存较大的一个。
尝试做内存缓存的内存管理。
out of memory exception occurs之前使用recycle()清空内存缓存。recycle() 在内部致力于检查引用计数机制:
它使用引用计数(在变量mDisplayRefCount 和mCacheRefCount 中)来跟踪位图当前是正在显示还是在缓存中。代码在满足这些条件时回收位图:
BitmapFactory.Options 类对象中使用inBitmap 字段来保留位图以供以后使用。其中,从 LruCache 中逐出位图,对位图的软引用放置在 HashSet 中,以便稍后与 inBitmap 重用:
Set<SoftReference<Bitmap>> mReusableBitmaps;
3。使用 BitmapFactory.Options 类有效地在小图像视图中加载大位图。通过计算 inSampleSize 并在 options.inSampleSize 字段中提供它。
inSampleSize 是一个因素,它决定了将大图像降低到小图像视图的程度,通过选项字段中的高度和宽度计算得出
【讨论】: