Glide学习笔记
Glide的典型用法,摘自github主页:
// For a simple view:
@Override public void onCreate(Bundle savedInstanceState) {
...
ImageView imageView = (ImageView) findViewById(R.id.my_image_view);
Glide.with(this).load("http://goo.gl/gEgYUd").into(imageView);
}
// For a simple image list:
@Override public View getView(int position, View recycled, ViewGroup container) {
final ImageView myImageView;
if (recycled == null) {
myImageView = (ImageView) inflater.inflate(R.layout.my_image_view, container, false);
} else {
myImageView = (ImageView) recycled;
}
String url = myUrls.get(position);
Glide
.with(myFragment)
.load(url)
.centerCrop()
.placeholder(R.drawable.loading_spinner)
.crossFade()
.into(myImageView);
return myImageView;
}
其中,Glide.with返回一个RequestManager实例。每一个Activity的context都有对应的RequestManager管理这个context下的加载数据请求;
调用RequestManager.load()方法返回RequestBuilder实例。从RequestBuilder的名字就可以看出来是用来生成Request请求的,centerCrop()、placeholder()等方法可以配置生成什么样的Request;
最后调用的RequestBuilder的into()方法将生成Request并且触发加载请求执行。
调用的RequestBuilder的into()后加载数据请求执行的过程可以用下面的时序图来说明:
Request是接口,一般会用到其实现类SingleRequest:
DecodeJob是实际的本地缓存加载、网络加载发生的地方,其执行过程稍复杂,结合代码DecodeJob.java来看下面的状态图:
另外,Engine类(Engine.java)有两处值得留意的的做法:
1,利用MessageQueue.IdleHandler的queueIdle方法清理EngineResource
2,Engine使用两种内存缓存:activeResources和memoryCache。
请求数据时如果memoryCache命中则将数据从memoryCache里remove,然后放入activeResources里;
EngineResource使用引用计数维护activeResources,引用计数归零时从activeResources中清除,然后必要的话放入memoryCache里。
activeResources和memoryCache相互配合增加了memoryCache的容量。