转载请注明出处:王亟亟的大牛之路
引用库的原作者Git:https://github.com/Trinea
现在很多需要动态呈现的View都使用到了H5和WebView,而有些使用的还是传统的异步加载操作,今天写的是传统的View的实现(H5的可以看这篇文章:http://blog.csdn.net/ddwhan0123/article/details/49683799)
我们常用的诸如ImageLoader ,Picasso 都有类似的效果,今天上的是国内大牛Trinea的ImageCache,那为什么用他的这个呢?
个人觉得他更轻量级,效果简单明了,一些衍生和伸展性做的也还不错。
一.说之前,还是说一下一些比较重要的知识点。(我们不生产知识,我们只是知识的搬运工)
缓存:java的对象创建需要分配资源较耗费时间,加上创建的对象越多会造成越频繁的gc影响系统响应。主要使用单例模式、缓存(图片缓存、线程池、View缓存、IO缓存、消息缓存、通知栏notification缓存)及其他方式减少对象创建。
然后缓存中,又图片缓存、线程池、View缓存、IO缓存、消息缓存、通知栏notification缓存等。(这不是我们主要讲的内容,不知道可以自己Google,这里只是例举下)
那么,在实用场景下会有哪些常见的异步加载问题呢?
a. 行item图片显示重复
这个显示重复是指当前行item显示了之前某行item的图片。
比如ListView滑动到第2行会异步加载某个图片,但是加载很慢,加载过程中listView已经滑动到了第14行,且滑动过程中该图片加载结束,第2行已不在屏幕内,根据上面介绍的缓存原理,第2行的view可能被第14行复用,这样我们看到的就是第14行显示了本该属于第2行的图片,造成显示重复。
b. 行item图片显示错乱
这个显示错乱是指某行item显示了不属于该行item的图片。
比如ListView滑动到第2行会异步加载某个图片,但是加载很慢,加载过程中listView已经滑动到了第14行,第2行已不在屏幕内,根据上面介绍的缓存原理,第2行的view可能被第14行复用,第14行显示了第2行的View,这时之前的图片加载结束,就会显示在第14行,造成错乱。
c. 行item图片显示闪烁
上面b的情况,第14行图片又很快加载结束,所以我们看到第14行先显示了第2行的图片,立马又显示了自己的图片进行覆盖造成闪烁错乱
因为,如果我们用 Back键回到上一个Activity再进来的时候是不是还要重新加载?或者我第一次加载存到本地,第二次再读本地IO?所以,缓存成为提高用户体验和节约性能一个很好的途径。
二.ImageCache
ImageCache有什么优势呢?
(1). 使用简单 (2). 轻松获取及预取新图片 (3). 包含二级缓存 (4). 可选择多种缓存算法(FIFO、LIFO、LRU、MRU、LFU、MFU等13种)或自定义缓存算法 (5). 可方便的保存及初始化恢复数据 (6). 支持文件sd卡保存及自定义文件名规则 (7). 省流量性能佳(有且仅有一个线程获取图片) (8). 支持不同类型网络处理 (9). 可根据系统配置初始化缓存 (10). 扩展性强 (11). 支持等待队列 (12). 包含map的大多数接口。
-1.使用:
a.初始化一个ImageCache 对象
public static final ImageCache IMAGE_CACHE = CacheManager.getImageCache();
b.需要加载图片的地方调用get(String imageUrl, View view)异步加载图片
IMAGE_CACHE.get(imageUrl, imageView);
就是辣么简单,效果就能达到。
当然,对缓存,线程等等