最简单的获取图片的方式:

1
Glide.with(activity).load("http://www.baidu.com/s.jpg").into(iv);

主线

Request(SingleRequest、RequestCoordinator) -> Engine(EngineJob、DecodeJob) -> GetData(Cache、LocalUriFetche、HttpUrlFetcher) -> Data -> Resource(decode、transcode、encode);
构建请求 -> Engine从缓存中获取数据 -> DecodeJob获取数据并处理 -> 回调到MainThread;

生命周期联动

Glide.with()方法可以带Activity,Fragment,Context等参数,其提供了了一个LifecycleListener用于表示请求的生命周期,提供有onStart()、onStop()、onDestroy()方法。
Glide对于不同的Context有着不同的保证生命周期联动的实现,执行with()方法时会通过RequestManagerRetriever的单例根据不同的Context获取RequestManager。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public RequestManager get(Fragment fragment) {
if (Util.isOnBackgroundThread()) {
// 方法运行在非UI线程时使用Application这个Context
return get(fragment.getActivity().getApplicationContext());
} else {
.FragmentManager fm = fragment.getChildFragmentManager();
return fragmentGet(fragment.getActivity(), fm);
}
}
RequestManager fragmentGet(Context context, FragmentManager fm) {
RequestManagerFragment current = getRequestManagerFragment(fm);
RequestManager requestManager = current.getRequestManager();
if (requestManager == null) {
requestManager = new RequestManager(context, current.getLifecycle(), current.getRequestManagerTreeNode());
current.setRequestManager(requestManager);
}
return requestManager;
}

RequestManagerFragment继承自Fragment,其生命周期方法中有ActivityFragmentLifecycle实现的onStart()、onStop()、onDestroy()方法,ActivityFragmentLifecycle维护了一个LifecycleListener列表,可以通过addListener的方式添加新的LifecycleListener。而LifecycleListener的实现则是在RequestManager中,通过RequestTracker来控制。
继而load()方法获得一个DrawableTypeRequest,DrawableTypeRequest继承自DrawableRequestBuilder,追踪到其父类的into方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public <Y extends Target<TranscodeType>> Y into(Y target) {
Request previous = target.getRequest();
if (previous != null) {
previous.clear();
requestTracker.removeRequest(previous);
previous.recycle();
}
Request request = buildRequest(target);
target.setRequest(request);
lifecycle.addListener(target);
requestTracker.runRequest(request);
return target;
}

构造好请求参数后,生成Request,最后用requestTracker执行请求。

TODO:
具体请求实现 缓存策略 okhttp接入 线程调度