@(Android艺术探索)[Android, Bitmap的加载和Cache]
Bitmap做缓存,通过缓存策略,我们不需要每次都从网络删该请求图片或者从存储设备中加载图片,这样就提高了图片的加载效率。现在常用的缓存策略有:LruCache和DiskLruCache
Bitmap的高效加载
- BirmapFactory类提供了四类方法:decodeFile、decodeResource、decodeStream和decodeByteArray,分别用于支持从文件系统、资源、输入流以及字节数组中加载出一个BItmap对象。
如何高效地加载Bitmap
- 采用BitmapFactory.Options来加载所需要尺寸的图片,将缩小的图片在ImageView中显示,这样Bitmap就会降低内存占有从而在一定程度上避免OOM。
- 在是哟领inSampleSize的取值应该总是为2的指数,比如1/2/4/8/16,等等
- 有效加载图片的四个步骤:
- 将BitmaoFactory.Options的inJustDecodeBounds参数设为true并加载图片
- 从BitmapFactory.Options中取出图片的原始宽高信息,他们对应于outWidth和outHeight参数
- 根据采样率的规则并结合目标View的所需大小计算出采样率inSamepleSize
- 将BitmapFactory.Options的inJustDecodeBounds参数设为false,然后重新加载图片
当inJusrDecodeBounds参数设为true时,BitmapFactory只会解析图片的原始宽、高信息,并不会去真正地加载图片。
Android中缓存策略
- 应用打算从网络上请求一张图片时,程序会首先从内存中取获取,如果内存中没有那就从存储设备中去获取,如果存储设备中也没有,那就从网络上获取这张图片
- 采用的最常用的缓存算法是LRU,LRU是近期最少使用算法,它的核心思想是当缓存满时,会优先淘汰那些近期最少使用的缓存对象。其中
LruCache
用于实现内存缓存,而DIskLruCache
则充当了存储设备缓存 - LruCache内部是采用了LInkedHashMap以强引用的方式存储外界缓存对象
- DiskLruCache用于实现存储设备缓存,即磁盘缓存,它通过将缓存对象写入文件系统从而实现缓存的效果。
- ImageLoder的实现
- 功能:图片的同步/异步加载,图片压缩,内存缓存,磁盘缓存,网络拉取
ImageLoder的使用
避免发生列表item错位的解决方法:给显示图片的imageview添加tag属性,值为要加载的图片的目标url,显示的时候判断一下url是否匹配。
优化列表的卡顿现象
- 不要在getView中执行耗时操作,不要在getView中直接加载图片,否则肯定会导致卡顿;
- 控制异步任务的执行频率:在列表滑动的时候停止加载图片,等列表停下来以后再加载图片;
- 使用硬件加速来解决莫名的卡顿问题,给Activity添加配置android:hardwareAccelerated=”true”。
作者最后贴出了ImageLoder的源码,非常精彩。ImageLoder源码