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

青旅半醒 2023-07-01 08:46 3阅读 0赞

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

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

总结RxJavaCallAdapterFactory

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

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

接着分析Retrofit源码:

20200120150127718.png

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

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

20200120150144460.png

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

20200120150213209.png

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

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

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

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3drX2JlaWNhaQ_size_16_color_FFFFFF_t_70

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

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

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

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

4.通过isDefaultMethod进行判断,

20200120150245730.png

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

20200120150305493.png

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

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

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

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

20200120150314260.png

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

20200120150333262.png

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

2020012015034734.png

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

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

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

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3drX2JlaWNhaQ_size_16_color_FFFFFF_t_70 1

1,实现的接口Call

  1. 构造函数传递的参数,一个是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解析数据

通过代码分析一下:

2020012015041378.png

点击进去查看:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3drX2JlaWNhaQ_size_16_color_FFFFFF_t_70 2

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

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3drX2JlaWNhaQ_size_16_color_FFFFFF_t_70 3

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

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

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

20200120150446736.png

这个createRawCall具体操作:

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

异步请求的实现:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3drX2JlaWNhaQ_size_16_color_FFFFFF_t_70 4

他是带回调方法的。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3drX2JlaWNhaQ_size_16_color_FFFFFF_t_70 5

他的大体与同步类似,

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3drX2JlaWNhaQ_size_16_color_FFFFFF_t_70 6

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

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

发表评论

表情:
评论列表 (有 0 条评论,3人围观)

还没有评论,来说两句吧...

相关阅读

    相关 知道Python迭代

    你所不知道的Python迭代器 自定义可迭代的类 将迭代器转换为列表 迭代就是循环的意思,也就是对一个集合中的元素进行循环,从而得到每一个元素。对于我们自定