Glide原理
- Glide.with(content).load(url).into(imageView)
- with绑定生命周期,load指定加载资源,into指明加载目标
生命周期:
创建一个无UI的Fragment,通过添加的这个Fragment 感知 Activity 、Fragment 的生命周期,通过Lifecycle在Fragment关键生命周期通知RequestManger进行相关的操作。
内存缓存:
- 活动缓存, 弱应用 HashMap,如果当前对应的图片资源正在使用,则这个图片会被Glide放入活动缓存。
- 内存缓存, LruCache LinkedHasMap,如果图片最近被加载过,并且当前没有使用这个图片,则会被放入内存缓存中。
- 磁盘缓存(DiskLruCache)缓存图片到本地。
磁盘缓存策略
- DiskCacheStrategy.DATA: 只缓存原始图片;
- DiskCacheStrategy.RESOURCE:只缓存转换过后的图片;
- DiskCacheStrategy.ALL:既缓存原始图片,也缓存转换过后的图片;对于远程图片,缓存 DATA和 RESOURCE;对于本地图片,只缓存 RESOURCE;
- DiskCacheStrategy.NONE:不缓存任何内容;
- DiskCacheStrategy.AUTOMATIC:默认策略,尝试对本地和远程图片使用最佳的策略。当下载网络图片时,使用DATA(原因很简单,对本地图片的处理可比网络要容易得多);对于本地图片,使用RESOURCE。
// 活动缓存
Map<Key, ResourceWeakReference> activeEngineResources = new HashMap<>();
// 内存缓存 LruCache
Map<T, Y> cache = new LinkedHashMap<>(100, 0.75f, true);
LeakCanary原理
- 继承ContentProvider,在onCreate()方法里面进行初始化。
- 在Application.ActivityLifecycleCallbacks 的 onActivityDestroyed方法调用RefWatcher.watch(), 监听Activity或者Fragment 销毁时候的生命周期。
- 通过弱引用和引用队列监控对象是否被回收(弱引用和引用队列ReferenceQueue联合使用时,如果弱引用持有的对象被垃圾回收,Java虚拟机就会把这个弱引用加入到与之关联的引用队列中。即 KeyedWeakReference持有的Activity对象如果被垃圾回收,该对象就会加入到引用队列queue)。