本文首发于 vivo互联网技术 微信公众号
Android上图片加载的解决方案有多种,但是官方认可的是Glide。Glide提供简洁易用的api,整个框架也方便扩展,比如可以替换网络请求库,同时也提供了完备的缓存机制,应用层不需要自己去管理图片的缓存与获取,框架会分成内存缓存,文件缓存和远程缓存。本文不会从简单的使用着手,会把重点放在缓存机制的分析上。

一、综述

开始之前,关于Glide缓存请先思考几个问题:
Glide有几级缓存?Glide内存缓存之间是什么关系?Glide本地文件IO和网络请求是一个线程吗?如果不是,怎么实现线程切换?Glide网络请求回来后数据直接返回给用户还是先存再返回?
加载开始入口从Engine.load()开始,先看下对这个方法的注释,
会先检查(Active Resources),如果有就直接返回,Active Resources没有被引用的资源会放入Memory Cache,如果Active Resources没有,会往下走。检查Memory Cache中是否有需要的资源,如果有就返回,Memory Cache中没有就继续往下走。检查当前在运行中的job中是否有改资源的下载,有就在现有的job中直接添加callback返回,不重复下载,当然前提是计算得到的key是一致的,如果还是没有,就会构造一个新的job开始新的工作。
* Starts a load for the given arguments. * *
Must be called on the main thread. * *
The flow for any request is as follows: **Check the current set of actively used resources, return the active resource if * present, and move any newly inactive resources into the memory cache.*Check the memory cache and provide the cached resource if present.*Check the current set of in progress loads and add the cb to the in progress load if * one is present.*Start a new load.*
ok, find the source code.

二、内存缓存

publicLoadStatus load( GlideContext glideContext, Object model, Key signature, int width, int height, ClassresourceClass, ClasstranscodeClass, Priority priority, DiskCacheStrategy diskCacheStrategy, Map