深入剖析你不知道的Retrofit网络请求神器(三)

我们继续上一篇的源码分析:

https://blog.csdn.net/wk_beicai/article/details/104048326

总结RxJavaCallAdapterFactory

理论上: 我们获取一个Call<T> 对象,用这个Call对象执行具体的Http请求,Retrofit调用这个Call请求,其实还是调用okHttp中的call请求,只不过对其进行封装,获取服务端返回给我们的数据,获取到数据后我们调用converter将数据转换成我们需要的对象,

具体实现:实现CallAdapter这个接口的Factory这个抽象类,并将这个CallAdapter注册到我们的Retrofit当中,注册完之后调用Factrory,get方法来进行获取具体的CallAdapter,最后调用Adapt这个方法将我们的Call请求转换为我们每个平台所适用的类型,

 

接着分析Retrofit源码:

深入剖析你不知道的Retrofit网络请求神器(三)

上边代码是通过retrofit,create();方法,传递我们定义的网络请求接口,实现的,

那么create里面是怎么实现的我们通过源码查看一下:

深入剖析你不知道的Retrofit网络请求神器(三)

通过validateServiceInterface这个方法对我们传过来的字节码做了一些验证:

深入剖析你不知道的Retrofit网络请求神器(三)

通过上边的代码可以看出,只是做了一些抛出异常的操作,

validateEagerly:这个就是我们之前提到过得标志位,是否需要提前验证这个接口,或者提前解析这个接口,就是这个标志位。

如果返回true的话,就需要提前验证,并走eagerlyalidateMethods这个方法:

深入剖析你不知道的Retrofit网络请求神器(三)

这个就是提前验证的方法:

1,首先获取一个我们当前的平台,通过Platform.get这个方法。

2.通过反射来获取我们传递的结果对象方法;

3.通过for循环,对接口中定义的方法进行遍历。

4.通过isDefaultMethod进行判断,

深入剖析你不知道的Retrofit网络请求神器(三)

这个方法默认返回false,所以上边的判断,肯定会走到,loadServiceMethod这个方法中,

深入剖析你不知道的Retrofit网络请求神器(三)

serviceMethodCache,这个大家是不是很熟悉,这个就是Retrofit的七个成员变量中的一个,

通过servoceMethodCache.get()方法,到这个缓存池中根据传递过来的method(这个method代表一个Http请求的方法)去查找我们的serviceMethod方法,如果有的话我们直接return回去,

如果没有我们就通过Builder构建者模式,并以键值对的形式添加到缓存池中,并返回。

 

我们回到create源码中,上边就是做提前验证所走的逻辑:

深入剖析你不知道的Retrofit网络请求神器(三)

上边的代码就是retrofit的精髓所在,通过动态代理返回我们网络请求的接口实例,通过实现new InvocationHandler这个方法中的invoke,代码如下:

深入剖析你不知道的Retrofit网络请求神器(三)

这个invoke这个方法,才是真正解析这个接口的地方,

深入剖析你不知道的Retrofit网络请求神器(三)

这三行代码才是最核心的,接下来我们详细的分析这三行代码:

第一行代码。上边就有所讲解,通过loadServiceMethod这个方法获取serviceMenthod

第二行代码OkhttpCall里面的实现:

深入剖析你不知道的Retrofit网络请求神器(三)

1,实现的接口Call<T>

2. 构造函数传递的参数,一个是serviceMethod,一个是我们传递过来的参数,

3,成员变量:

1)serviceMethod:表示网络请求参数信息的对象,

2)args: 一个数组。表示我们网络请求的一些参数;

3)cancled: 这是一个状态标志位,判断用于是否取消这个http请求

4)rawCall :这个就是我们实际进行网络访问的类 okhttp

5) createionFailure :就相当于一个异常

6)executed : 标志位,请求异步方法是判断的逻辑

第三行代码:通过CallAdapter.adapt()这个方法传递okHttpCall进行返回;

 

Rtrofit请求:

1,同步请求:OkHttpCall.execute();方法:

2.异步请求:OkHttpCall.enqueue();方法:

 

2.他们的区别:

他们的唯一不同就是异步请求将我们回调方法交给我们回调执行器

 

3,同步请求方法讲解:

1)我们需要对我们网络请求接口中的方法以及每一个参数利用ParameterHandler进行解析,

2)根据serviceMethod对象创建一个http请求的request对象。进行实际的网络请求。

3)通过OkHttp底层发送网络请求

4)通过converter解析数据

 

通过代码分析一下:

深入剖析你不知道的Retrofit网络请求神器(三)

点击进去查看:

深入剖析你不知道的Retrofit网络请求神器(三)

我们点击execute进行查看具体实现:

深入剖析你不知道的Retrofit网络请求神器(三)

1,创建一个OkHttp,call的请求对象

2.在一个同步代码快中做一些判断

3.通过createRawCall方法创建一个Okhttp的call请求,

深入剖析你不知道的Retrofit网络请求神器(三)

这个createRawCall具体操作:

通过传递过来的参数以及serviceMethod.toRequest方法生成一个request

 

异步请求的实现:

深入剖析你不知道的Retrofit网络请求神器(三)

他是带回调方法的。

深入剖析你不知道的Retrofit网络请求神器(三)

他的大体与同步类似,

深入剖析你不知道的Retrofit网络请求神器(三)

这里是不同的,这里是真正的异步请求,解析成功和失败,

到这里整个Retrofit源码分析就结束了,整理出了三篇博客分享给大家。