BitmapUtils加载机制

BitmapUtils加载bitmap流程

     BitmapUtils主要解决Android加载图片出现的OOM现象,采取了多级缓存机制(内存缓存和磁盘缓存)保存图片避免OOM现象,采取异步加载bitmap,在listView快速滑动时停止加载。

1.   BitmapUtils接口支持AssetsUrlPath的图片路径。

     BitmapGlobalConfig主要配置磁盘缓存路径,程序内存缓存大小。(不设置有默认值),直接在bitmapUtils初始化时设置。

     BitmapDisplayConfig主要配置异步加载未完成时临时显示的图片,加载失败显示的图片,加载过程中的动画,图片是否翻转,是否显示原图以及显示图片的最大Size等。

2.   为何出现OOMbitmaputils如何规避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。

 

posted @ 2016-04-21 11:01  侠客行猴子  阅读(1041)  评论(0)    收藏  举报