Glide操作
EngineJob中两个线程池:
- 都是FifoPriorityThreadPoolExecutor
- 负责缓存decode的DiskCacheService
负责网络请求的 SourceService
- with()
- 返回一个 RequestManager (实现了LifeCyleListener,且创建了一个FifoPriorityThreadPoolExecutor) 创建一个RequestManagerFragment(该fragment带有ActivityFragmentLifeCycle)使用LifeCycle来管理生命周期的绑定关系
- load()
- 返回一个GenericRequestBuilder
- into()
- 四个类型
- Center_Crop
- Fit_Center
- Fit_Start
- Fit_End
- FifoPriorityThreadPoolExecutor
- LoadTask 有priority的FutureTask,进入排队addWorker()--->workers.add()-->HashSet.add().按照Priority排队
- 四个类型
- Engine负责加载缓存还是网络请求
- 如果没有缓存,则Engine中的EngineJob负责请求网路数据
into的总流程:GenericRequestBuilder里面
requestTracker.runRequest(request)----->request.begin()----->onSizeReady(),获取到ImageVideoFetcher、--->Engine.load()--->locadFromCache()缓存cache有无---->laodFromActiveResources() 判断ActvitResources有无---->以上均无,则封装一个EngineJob和EngineRunnable,用engineJob.start(runnable),run()方法里面decode()操作,接着是loadData()---->如果是网络,则是走HttpUrlFetcher的loadData()--->返回一个ImageVideoWrapper给decodeSource()
实现生命周期的管理原理:
- lifeCycle
- 给Activity和Fragment添加一个隐藏的Fragment
- 如果我们是在非主线程当中使用的Glide,那么不管你是传入的Activity还是Fragment,都会被强制当成Application来处理
总的流程:
Glide.with()--->构建了Engine--->EngineJob构建了两个线程池--->into是做处理
- Glide和Picasso的区别
- Glide默认加载ARGB_565,Picasso加载ARGB_8888,Picasso占用内存大
- Glide缓存裁剪后的图片,每次同一张图片放到不同size的target,需要重新网路请求。Picasso缓存全尺寸,所以Picasso容易OOM
- Glide支持加载gif
- Glide的包比Picasso的包大