在上篇文章中,我们介绍了Glide图片加载框架的使用,通过之前的学习,我们可能已经能熟练的将Glide图片加载框架运用到我们的项目中,但是如果有人问你它是如何加载,工作原理是怎样的?为什么自定义GlideModule只需要在Manifest文件中加入meta-data即可?等等很多加载流程以及使用的注意事项。当然要想搞明白这些问题,就需要我们对Glide源码有个大致的认识,去剖析源码深处的奥秘。
接下来就让我们一起去进入Glide的源码世界,本篇文章分析的是Glide 3.7.0版本。特别提醒,阅读本篇文章之前要对Glide的用法要先有一个了解,可以先阅读上篇文章,详谈高大上的图片加载框架Glide -应用篇。
此篇文章是自己学习的一个记录,若对阅读文章的你有一定帮助,很是高兴,当然文章如有不足或者错误的地方,欢迎指正,避免我给其他读者错误引导。
如果你阅读过上篇文章,或者你使用过Glide,就知道Glide加载图片的最简单方式就是
1 |
Glide.with(context).load(url). placeholder(R.drawable.placeholder).into(imageView)。 |
那么这篇文章就以这句简单的代码为主线,逐步深入Glide的源码。
Glide.with(context)
1 2 3 4 5 6 |
//获取RequestManager对象,该类实现了LifeCycleListener接口,绑定Activity/Fragment生命周期,对请求进行暂停,恢复,清除操作 public static RequestManager with(Context context) { //得到RequestManagerRetriever实例,该类注意将RequestManager和自定义Fragment(如RequestManagerFragment,SupportRequestManagerFragment)绑定,从而实现在生命周期管理回调 RequestManagerRetriever retriever = RequestManagerRetriever.get(); return retriever.get(context); } |
Glide有四个静态的重载方法with(),其内部都通过RequestManagerRetriever相应的get重载方法获取一个RequestManager对象。RequestManagerRetriever提供各种重载方法的好处就是可以将Glide的加载请求与Activity/Fragment的生命周期绑定而自动执行请求,暂停操作。
接下来我们拿Activity参数分析Glide请求如何和绑定生命周期自动请求,暂停,以及销毁。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public RequestManager get(Activity activity) { if (Util.isOnBackgroundThread() || Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) { return get(activity.getApplicationContext()); } else { //判断activity是否已经是销毁状态 assertNotDestroyed(activity); //获取FragmentManager 对象 android.app.FragmentManager fm = activity.getFragmentManager(); //创建Fragment,RequestManager并将其绑定 return fragmentGet(activity, fm); } } |
assertNotDestroyed主要断言Activity是否已经Destroyed。若是没有销毁,或者Activity的FragmentManager ,然后通过fragmentGet返回RequestManager。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
@TargetApi(Build.VERSION_CODES.HONEYCOMB) RequestManager fragmentGet(Context context, android.app.FragmentManager fm) { //*获取RequestManagerFragment,主要利用Frament进行请求的生命周期管理 RequestManagerFragment current = getRequestManagerFragment(fm); RequestManager requestManager = current.getRequestManager(); //requestManager 为空,即首次加载初始化requestManager ,并调用setRequestManager设置到RequestManagerFragment if (requestManager == null) { requestManager = new RequestManager(context, current.getLifecycle(), current.getRequestManagerTreeNode()); current.setRequestManager(requestManager); } return requestManager; } //获取Fragment对象 RequestManagerFragment getRequestManagerFragment(final android.app.FragmentManager fm) { RequestManagerFragment current = (RequestManagerFragment) fm.findFragmentByTag(FRAGMENT_TAG); if (current == null) { current = pendingRequestManagerFragments.get(fm); if (current == null) { current = new RequestManagerFragment(); 但是如果有人问你它是如何加载,工作原理是怎样的?为什么自定义GlideModule只需要在Manifest文件中加入meta-data即可?等等很多加载流程以及使用的注意事项。当然要想搞明白这些问题,就需要我们对Glide源码有个大致的认识,去剖析源码深处的奥秘。
接下来就让我们一起去进入Glide的源码世界,本篇文章分析的是Glide 3.7.0版本。特别提醒,阅读本篇文章之前要对Glide的用法要先有一个了解,可以先阅读上篇文章,详谈高大上的图片加载框架Glide -应用篇。 此篇文章是自己学习的一个记录,若对阅读文章的你有一定帮助,很是高兴,当然文章如有不足或者错误的地方,欢迎指正,避免我给其他读者错误引导。 如果你阅读过上篇文章,或者你使用过Glide,就知道Glide加载图片的最简单方式就是
那么这篇文章就以这句简单的代码为主线,逐步深入Glide的源码。 Glide.with(context)
Glide有四个静态的重载方法with(),其内部都通过RequestManagerRetriever相应的get重载方法获取一个RequestManager对象。RequestManagerRetriever提供各种重载方法的好处就是可以将Glide的加载请求与Activity/Fragment的生命周期绑定而自动执行请求,暂停操作。 接下来我们拿Activity参数分析Glide请求如何和绑定生命周期自动请求,暂停,以及销毁。
assertNotDestroyed主要断言Activity是否已经Destroyed。若是没有销毁,或者Activity的FragmentManager ,然后通过fragmentGet返回RequestManager。
|