为什么要用Glide
- 链式调用,兼容系统控件imageView,使用非常简单。不必像Fresco那样得用SimpleDrawableView
Glide.with(this)
.load(data.teacher_image)
.placeholder(R.drawable.recommend_teacher_icon)
.error(R.drawable.recommend_teacher_icon)
.apply(RequestOptions.circleCropTransform())
.diskCacheStrategy(DiskCacheStrategy.ALL)
.into(ivTIcon)
- 可以感知activity和fragment的生命周期做图片加载的控制。
实现原理:通过 Glide.with(this)函数,传入当前的context对象。进行相应的判断转化,拿到当前fragmentManager。然后RequestManagerRetriever创建出来一个没有布局的fragment,并且把RequestManager和ActivityFragmentLifecycle相关联,实现生命周期的监控和图片网络请求的处理,防止内存泄露。 - 通过DefaultConnectivityMonitor注册网络变化广播感知网络变化监听,RequestManager处理图片请求。
- 采用内存缓存和磁盘缓存减少流量消耗,加快响应速度。
- 内存缓存,采用Lrucache算法,防止存储的内存过大,OOM。
假如让你实现个图片加载框架,会考虑哪些问题
- 图片网络请求,异步加载,需要线程池
- 切换到主线程更新UI:Handler
- 缓存:LruCache
- 防止OOM: 软引用(map) , LruCache, 图片压缩处理(按比例压缩inSampleSize,压缩图片质量,RGB-565)
- 防止内存泄露,通过对生命周期的管理
- 列表滑动加载问题 (通过给imageView设置tag,防止图片错乱)
LruCache小结
- LruCache 内部用LinkHashMap存取数据,设置的accessOrder为true,即按照访问顺序排序。添加和删除元素不影响迭代顺序,获取元素会导致重新排序,获取到的元素排到队尾。当容量达到上限时,删除最近最少使用的元素也就是队列头部的元素。
代码示例:
//put和remove元素后不影响迭代顺序
Map<Integer, String> linkedHashMap = new LinkedHashMap<Integer, String>(16, 0.75f, true);
linkedHashMap.put(3, "order3");
linkedHashMap.put(1, "order1");
linkedHashMap.put(2, "order2");
linkedHashMap.get(3); //此时顺序为 1->2->3
linkedHashMap.remove(1);//此时顺序为 2->3
linkedHashMap.put(4, "order4");//此时顺序为 2->3->4
linkedHashMap.forEach((key, value) -> System.out.println(key + "-->" + value));
输出结果:
2-->order2
3-->order3
4-->order4