最简单的获取图片的方式:
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()) { 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接入 线程调度