BitmapUtils加载bitmap流程
BitmapUtils主要解决Android加载图片出现的OOM现象,采取了多级缓存机制(内存缓存和磁盘缓存)保存图片避免OOM现象,采取异步加载bitmap,在listView快速滑动时停止加载。
1. BitmapUtils接口支持Assets、Url、Path的图片路径。
BitmapGlobalConfig主要配置磁盘缓存路径,程序内存缓存大小。(不设置有默认值),直接在bitmapUtils初始化时设置。
BitmapDisplayConfig主要配置异步加载未完成时临时显示的图片,加载失败显示的图片,加载过程中的动画,图片是否翻转,是否显示原图以及显示图片的最大Size等。
2. 为何出现OOM,bitmaputils如何规避OOM
出现OOM的原因主要有:加载对象过大,加载资源过多,内存没来得及释放,导致系统内存不足。
BitmapUtils主要采取两种方式加载图片避免OOM。
(1)内存缓存(LruCache)。主要采取LinkedHashMap< MemoryCacheKey, Bitmap >存储bitmap到缓存中,默认系统缓存为4M,当内存超出4M,移除上一元素的缓存。
(2)采取decodeFileDescriptor与BitmapFactory.Options结合动态分配bitmap内存。
BitmapFactory.Options options = new BitmapFactory.Options(); options.inTempStorage = new byte[12 * 1024]; options.inSampleSize = 1; bitmap = BitmapFactory.decodeFileDescriptor(ins.getFD(), null, options);
用BitmapFactory解码一张图片时,会遇到OOM现象。这往往是由于图片过大造成的。要想正常使用,则需要分配更少的内存空间来存储。以下两个参数只需要设置一个即可实现动态分配bitmap内存。
inTempStorage设置图片资源临时空间。
inSampleSize设置恰当的inSampleSize可以使BitmapFactory分配更少的空间以消除OOM。
3. BitmapUtils加载Bitmap策略
(1)首先加载内存缓存bitmap。
(2)在内存缓存获取不到的情况下,加载文件缓存的文件输入流,把文件输入流转化为bitmap,同时存储到内存缓存中,并且回收当前的bitmap。
(3)直接加载路径下的资源(Assets、Path、URL)处理都一样,都是获取文件输入流。通过BitmapFactory.decodeFileDescriptor,把文件输入流转化为bitmap,同时保存文件输入map。