Android图片三级缓存技术
2018-10-29 本文已影响41人
WangSins
图片的三级缓存
- 内存缓存,缓存的是Bitmap对象,用Map<String,Bitmap>结构缓存,key是url
- 本地(sd卡)缓存,缓存的是图片文件,storage/sdcard/Android/data/pakageName/files/图片文件名(xxx.jpg)
- 远程服务器缓存,缓存的是图片文件,远程服务器应用中
如何使用三级缓存?
- 根据url从一级缓存中去对应Bitmap对象
如果有:显示结束(结束)
如果没有:进入2 - 从二级缓存中查找:得到文件名并在SD卡缓存目录下加载图片文件得到Birmap对象
如果有:显示,缓存到一级缓存中(结束)
如果没有:进入3 - 显示代表提示正在加载的图片,启动分线程联网请求得到Bitmap对象
如果有:显示,缓存到一级缓存,缓存到二级缓存
如果没有:显示提示错误图片(结束)
在ListView中使用图片三级缓存会存在图片闪动bug
- 原因
converView被复用了 - 解决
- 每次getView()都将图片的url保存到ImageView上:imageView.setTag(imagPath)
- 在分线程准备请求加载图片之前,比较准备加载图片的url与ImageView中保存的最新图片的url是同一个,
如果不是同一个,当前加载图片任务不再执行
如果相同,继续执行加载远程图片 - 在主线程准备显示图片之前,比较加载到图片的url与ImageView中保存的最新图片url时同一个,
如果不是同一个,不需要显示此图片
如果相同 ,显示图片