上一篇文章讲解Retrofit使用过程:
https://blog.csdn.net/wk_beicai/article/details/104030451
接下来讲解通过源码分析,它的Builder整个过程:
点击Retrofit查看源码:
首先是这七个重要的成员变量:
serviceMethodCache:用于缓存的,存储一些网络请求的配置,网络请求的方法,网络请求的适配器等等。
callFactory: 他是我们请求网络的OkHttp的工厂,
baseUrl : 这是网络请求的URL的基地址
converterFactories:数据转换器工厂的集合,放置数据转换器的工厂
adapterFactories:网络请求适配器工厂的集合,例如,RxJava,
callbackExecutor:用于执行回调的,
valodateEagerly: 标志位,是否立即解析我们接口的方法
一,我们点击Builder()查看一下源码:
1,无参构造方法
点击进来之后,我们看到这是他的构造方法,其实这个Builder是Retrofit类的一个内部类:
我们看他的成员变量:
platform: 表示Retrofit适配的平台,例如android,ios等
callFactory: 表示请求网络的okhttp的工厂,
baseUrl: 网络请求的url地址
converterFactories:数据转换器工厂的集合,放置数据转换器的工厂
adapterFactories:网络请求适配器工厂的集合,例如,RxJava,
callbackExecutor:用于执行回调的,
valodateEagerly: 标志位,是否立即解析我们接口的方法
细心的读者会看到,Builder与Retrofit类的成员变量大体是一致的。这个构建者模式就是通过Builder类配置的,通过配置这个类就可以把Retrofit类的成员变量初始化了。
接下来我们看Builder类的无参构造方法:
他返回的就是我们成员变量离得适配平台,
我们点击Platform,查看Platform这个类:
这是一个单例模式:通过findPlatform来进行实例的,支持不同的平台,
findPlatoform这个方法,通过反射机制,Class.forName去查找加载指定的类。返回给我们一个android对象。
我们点击Platform.Android(); 查看内部实现了什么?
我们先看DefaultCallBackExecutor:
这个方法表示,我们会返回一个默认的回调方法执行器,作用就是用来切换线程,从子线程切换到主线程,同时可以在主线程中执行回调方法,
大家看看这个代码:是不是上边需要返回的MainThreadExecutor,这个方法做了什么那?
内部是一个Handler,handler方法传入的值是我们的MainLooper,
所以说这就可以看出,这就是他能在主线程中切换的原因。
这个方法又表示什么?
默认的网络请求适配器工厂,让我们的Call请求在异步调用的时候,他会指定我们的Executor,来执行回调。
2,Builder有参的构造方法:
首先我们看传入的参数,传入的适配平台,将传入的适配平台赋值给我们的成员变量,
下面有一个非常重要的代码:
this,converterFactories,add(new BuiltInConverters());
这个BuiltInConverters(),表示我们内置的数据转换器工厂,
二,baseUrl,
这个是设置网络请求的url地址
我们点击进去看看实现:
1,首先做的判断是这个baseurl是否为空
2.通过parse这个方法将String类型的url转换为HttpUrl类型的变量,
3,return this,baseUrl(httpUrl);进行返回
我们查看baseUrl 实现了什么?
1,还是做非空判断
2. 通过pathSegments();将baseUrl拆分成碎片
3.判断我们最后一个集合是不是以/为结尾的,这个url必须以/为结尾
总结:
baseUrl主要是将String类型的Url转换为HttpUrl类型
三,addConverterFactory
用于设置数据解析器的,点击进行查看源码:
主要做的就是讲传递过来的factory加入我们的ConverterFacroties这个集合中。
接下来我们研究传递的参数:
首先需要创建一个Gson对象,进行return Create(new Gson);
那么这个Create做了什么?
他主要创建一个含有gson的GsonConverterFactory。
那么这个GsonConverterFactory做了什么操作?
只是做了一些赋值操作,赋值给final 定义的Gson,并进行返回。
四。addCallAdapterFactory 支持RxJava平台
主要做的就是讲传递过来的factory加入我们的adapterFactories这个集合中。
细心的可以看出它与addConverterFactory做的大体一致
点击Create看看如何操作的?
Scheduler 这是RxJava中的调度器,这里不做具体讲解
返回给我们一个RxJavaCallAdapterFactory(Scheduler);
五,Build 完成Retrofit的创建
1,首先判断baseUrl不能为null否则就会抛出异常,由此看出BaseUrl的重要性。
2.callFactory,我们网络请求的执行器,
判断是否为null,如果为nyll,就会默认创建一个OkHttpClent();
3,Executor,做异步请求操作的,在子线程做耗时操作,回主线程显示UI,这个时候就会用到它。
4.ArrayList那段代码:主要是将我们网络请求适配器工厂作为参数添加到集合当中,
配置网络请求适配器的工厂,并将平台默认的添加其中,
5.将我们之前传递的参数传到Retrofit当中,
这个就是Build方法。
整体Retrofit的Builder创建源码分析就这么多。完成整个的创建。