《Android开发艺术探索第十二章读书笔记》 Bitmap的加载和Cache

@(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是否匹配。
优化列表的卡顿现象

  1. 不要在getView中执行耗时操作,不要在getView中直接加载图片,否则肯定会导致卡顿;
  2. 控制异步任务的执行频率:在列表滑动的时候停止加载图片,等列表停下来以后再加载图片;
  3. 使用硬件加速来解决莫名的卡顿问题,给Activity添加配置android:hardwareAccelerated=”true”。

作者最后贴出了ImageLoder的源码,非常精彩。ImageLoder源码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值