Java知识分享网 - 轻松学习从此开始!    

Java知识分享网

Java1234官方群25:java1234官方群25
Java1234官方群25:838462530
        

实战springboot+CAS单点登录课程(免费领取)

SpringBoot打造全栈在线教育平台实战课程

毕设代做论文包查重联系人QQ:1982956321毕设大神 毕设代做论文包查重

66套java实战课程无套路领取

Java1234 VIP课程

领取微信扫码登录Java实现视频教程

Java1234至尊VIP(特价活动)

一线互联网三方源码高频面试总结 PDF 下载


分享到:
时间:2020-11-11 15:04来源:http://www.java1234.com 作者:小锋  侵权举报
一线互联网三方源码高频面试总结 PDF 下载
失效链接处理
一线互联网三方源码高频面试总结 PDF 下载

本站整理下载:
 
相关截图:


主要内容:

1.Glide :加载、缓存、LRU 算法 (如何自 己设计一个大图加载框架) (LRUCache 原 理)如何阅读源码 在开始解析 Glide 源码之前,我想先和大家谈一下该如何阅读源码,这个问题也是我平时被 问得比较多的,因为很多人都觉得阅读源码是一件比较困难的事情。 那么阅读源码到底困难吗?这个当然主要还是要视具体的源码而定。比如同样是图片加载框 架,我读 Volley 的源码时就感觉酣畅淋漓,并且对 Volley 的架构设计和代码质量深感佩服。 读 Glide 的源码时却让我相当痛苦,代码极其难懂。当然这里我并不是说 Glide 的代码写得 不好,只是因为 Glide 和复杂程度和 Volley 完全不是在一个量级上的。 那么,虽然源码的复杂程度是外在的不可变条件,但我们却可以通过一些技巧来提升自己阅 读源码的能力。这里我和大家分享一下我平时阅读源码时所使用的技巧,简单概括就是八个 字:抽丝剥茧、点到即止。应该认准一个功能点,然后去分析这个功能点是如何实现的。但 只要去追寻主体的实现逻辑即可,千万不要试图去搞懂每一行代码都是什么意思,那样很容 易会陷入到思维黑洞当中,而且越陷越深。因为这些庞大的系统都不是由一个人写出来的, 每一行代码都想搞明白,就会感觉自己是在盲人摸象,永远也研究不透。如果只是去分析主 体的实现逻辑,那么就有比较明确的目的性,这样阅读源码会更加轻松,也更加有成效。 而今天带大家阅读的 Glide 源码就非常适合使用这个技巧,因为 Glide 的源码太复杂了,千 万不要试图去搞明白它每行代码的作用,而是应该只分析它的主体实现逻辑。那么我们本篇 文章就先确立好一个目标,就是要通过阅读源码搞明白下面这行代码: Glide.with(this).load(url).into(imageView); 到底是如何实现将一张网络图片展示到 ImageView 上面的。先将 Glide 的一整套图片加载机 制的基本流程梳理清楚,然后我们再通过后面的几篇文章具体去了解 Glide 源码方方面面的 细节。 准备好了吗?那么我们现在开始。 源码下载 既然是要阅读 Glide 的源码,那么我们自然需要先将 Glide 的源码下载下来。其实如果你是 使用在 build.gradle 中添加依赖的方式将 Glide 引入到项目中的,那么源码自动就已经下载下 来了,在 Android Studio 中就可以直接进行查看。
不过,使用添加依赖的方式引入的 Glide,我们只能看到它的源码,但不能做任何的修改, 如果你还需要修改它的源码的话,可以到 GitHub 上面将它的完整源码下载下来。 Glide 的 GitHub 主页的地址是:https://github.com/bumptech/glide 不过在这个地址下载到的永远都是最新的源码,有可能还正在处于开发当中。而我们整个系 列都是使用 Glide 3.7.0 这个版本来进行讲解的,因此如果你需要专门去下载 3.7.0 版本的源 码,可以到这个地址进行下载:https://github.com/bumptech/glide/tree/v3.7.0 开始阅读 我们在上一篇文章中已经学习过了,Glide 最基本的用法就是三步走:先 with(),再 load(), 最后 into()。那么我们开始一步步阅读这三步走的源码,先从 with()看起。 1. with() with()方法是 Glide 类中的一组静态方法,它有好几个方法重载,我们来看一下 Glide 类中所 有 with()方法的方法重载: public class Glide { ... public static RequestManager with(Context context) { RequestManagerRetriever retriever = RequestManagerRetriever.get(); return retriever.get(context); }public static RequestManager with(Activity activity) { RequestManagerRetriever retriever = RequestManagerRetriever.get(); return retriever.get(activity); }public static RequestManager with(FragmentActivity activity) { RequestManagerRetriever retriever = RequestManagerRetriever.get(); return retriever.get(activity); }@TargetApi(Build.VERSION_CODES.HONEYCOMB) public static RequestManager with(android.app.Fragment fragment) { RequestManagerRetriever retriever = RequestManagerRetriever.get(); return retriever.get(fragment); }public static RequestManager with(Fragment fragment) {
RequestManagerRetriever retriever = RequestManagerRetriever.get(); return retriever.get(fragment); } }可以看到,with()方法的重载种类非常多,既可以传入 Activity,也可以传入 Fragment 或者 是 Context。每一个 with()方法重载的代码都非常简单,都是先调用 RequestManagerRetriever 的静态 get()方法得到一个 RequestManagerRetriever 对象,这个静态 get()方法就是一个单例 实现,没什么需要解释的。然后再调用 RequestManagerRetriever 的实例 get()方法,去获取 RequestManager 对象。 而 RequestManagerRetriever 的实例 get()方法中的逻辑是什么样的呢?我们一起来看一看: public class RequestManagerRetriever implements Handler.Callback { private static final RequestManagerRetriever INSTANCE = new RequestManagerRetriever(); private volatile RequestManager applicationManager; ... /*** Retrieves and returns the RequestManagerRetriever singleton. */ public static RequestManagerRetriever get() { return INSTANCE; }private RequestManager getApplicationManager(Context context) { // Either an application context or we're on a background thread. if (applicationManager == null) { synchronized (this) { if (applicationManager == null) { // Normally pause/resume is taken care of by the fragment we add to the fragment or activity. // However, in this case since the manager attached to the application will not receive lifecycle // events, we must force the manager to start resumed using ApplicationLifecycle. applicationManager = new RequestManager(context.getApplicationContext(), new ApplicationLifecycle(), new EmptyRequestManagerTreeNode()); } }
}return applicationManager; }public RequestManager get(Context context) { if (context == null) { throw new IllegalArgumentException("You cannot start a load on a null Context"); } else if (Util.isOnMainThread() && !(context instanceof Application)) { if (context instanceof FragmentActivity) { return get((FragmentActivity) context); } else if (context instanceof Activity) { return get((Activity) context); } else if (context instanceof ContextWrapper) { return get(((ContextWrapper) context).getBaseContext()); } }return getApplicationManager(context); }public RequestManager get(FragmentActivity activity) { if (Util.isOnBackgroundThread()) { return get(activity.getApplicationContext()); } else {assertNotDestroyed(activity); FragmentManager fm = activity.getSupportFragmentManager(); return supportFragmentGet(activity, fm); } }public RequestManager get(Fragment fragment) { if (fragment.getActivity() == null) { throw new IllegalArgumentException("You cannot start a load on a fragment before it is attached"); }if (Util.isOnBackgroundThread()) { return get(fragment.getActivity().getApplicationContext()); } else {FragmentManager fm = fragment.getChildFragmentManager(); return supportFragmentGet(fragment.getActivity(), fm); } }@TargetApi(Build.VERSION_CODES.HONEYCOMB) public RequestManager get(Activity activity) {
 

------分隔线----------------------------
锋哥公众号


锋哥微信


关注公众号
【Java资料站】
回复 666
获取 
66套java
从菜鸡到大神
项目实战课程