深入剖析你不知道的Retrofit网络请求神器(三)
我们继续上一篇的源码分析:
https://blog.csdn.net/wk_beicai/article/details/104048326
总结RxJavaCallAdapterFactory
理论上: 我们获取一个Call
具体实现:实现CallAdapter这个接口的Factory这个抽象类,并将这个CallAdapter注册到我们的Retrofit当中,注册完之后调用Factrory,get方法来进行获取具体的CallAdapter,最后调用Adapt这个方法将我们的Call请求转换为我们每个平台所适用的类型,
接着分析Retrofit源码:
上边代码是通过retrofit,create();方法,传递我们定义的网络请求接口,实现的,
那么create里面是怎么实现的我们通过源码查看一下:
通过validateServiceInterface这个方法对我们传过来的字节码做了一些验证:
通过上边的代码可以看出,只是做了一些抛出异常的操作,
validateEagerly:这个就是我们之前提到过得标志位,是否需要提前验证这个接口,或者提前解析这个接口,就是这个标志位。
如果返回true的话,就需要提前验证,并走eagerlyalidateMethods这个方法:
这个就是提前验证的方法:
1,首先获取一个我们当前的平台,通过Platform.get这个方法。
2.通过反射来获取我们传递的结果对象方法;
3.通过for循环,对接口中定义的方法进行遍历。
4.通过isDefaultMethod进行判断,
这个方法默认返回false,所以上边的判断,肯定会走到,loadServiceMethod这个方法中,
serviceMethodCache,这个大家是不是很熟悉,这个就是Retrofit的七个成员变量中的一个,
通过servoceMethodCache.get()方法,到这个缓存池中根据传递过来的method(这个method代表一个Http请求的方法)去查找我们的serviceMethod方法,如果有的话我们直接return回去,
如果没有我们就通过Builder构建者模式,并以键值对的形式添加到缓存池中,并返回。
我们回到create源码中,上边就是做提前验证所走的逻辑:
上边的代码就是retrofit的精髓所在,通过动态代理返回我们网络请求的接口实例,通过实现new InvocationHandler这个方法中的invoke,代码如下:
这个invoke这个方法,才是真正解析这个接口的地方,
这三行代码才是最核心的,接下来我们详细的分析这三行代码:
第一行代码。上边就有所讲解,通过loadServiceMethod这个方法获取serviceMenthod
第二行代码OkhttpCall里面的实现:
1,实现的接口Call
- 构造函数传递的参数,一个是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解析数据
通过代码分析一下:
点击进去查看:
我们点击execute进行查看具体实现:
1,创建一个OkHttp,call的请求对象
2.在一个同步代码快中做一些判断
3.通过createRawCall方法创建一个Okhttp的call请求,
这个createRawCall具体操作:
通过传递过来的参数以及serviceMethod.toRequest方法生成一个request
异步请求的实现:
他是带回调方法的。
他的大体与同步类似,
这里是不同的,这里是真正的异步请求,解析成功和失败,
到这里整个Retrofit源码分析就结束了,整理出了三篇博客分享给大家。
还没有评论,来说两句吧...