
我们使用Retrofit进行网络请求要定义网络请求的接口类。并在类中添加一个方法,这个方法添加了GET注解。这个GET很好理解,代表着整个Http请求通过GET来获取网络数据的。
如何创建网络接口的实例?

调用的create这个方法完后曾网络接口的实例。这个create内部使用了观察者模式和代理模式,外观模式。通过网络接口里的设置,我们可以使用注解进行相应的配置。
看一下create方法中判断validateEagerly这个标志位,中有一个eagerlyValidateMethods方法:

这个方法会遍历声明好的方法,然后调用loadServiceMethod这个方法,依次循环遍历都会调用这个方法。这个方法的作用就是他会给我们接口中的每一个方法的注解进行解析,然后存到ServiceMethod这个对象。ServiceMethod包含封装了网络请求属性的信息,它会将method传入LinkedHashMap集合中。
看一下loadServiceMethod:

他是在一个单例的形式当中,通过get方法获取到相应的value值,然后将它传入到linkedHashMap中。为什么要使用linkedHashMap?我们通过迭代器调用next方法,这里获取到的是整个集合当中最不经常用到的元素,所以说它也是一种aru算法的实现。如果不是提前验证的话,这时候就会动态解析对应的方法,然后得到相应的ServiceMethod对象,最后把他存入到集合当中,这种形式也是一种延时加载的形式,也是一种默认状态下的形式。

动态代理就是动态的生成网络请求接口的动态代理类。然后将这个代理类创建好之后交给InvocationHandler类来处理,然后复写invoke这个方法来做实际的网路请求拦截的操作。InvocationHandler作为具体的实现,最终会返回一个动态代理的对象,而整个生成实例的过程中,还生成实现的缓存机制。
loadServiceMethod读取网络请求接口的方法,并根据前面配置好的属性去配置ServiceMethod对象。ServiceMethod包含了所有请求的属性和信息。
根据创建好的ServiceMethod对象以及前面传递进来的参数去创建OkHttpCall的请求对象。
最后会调用OkHttpCall根据OkHttpCall返回我们需要的对象,会通过adapter就是网络请求适配器的adapter方法来进行适配的。
简单总结一下:我们创建网络请求接口的实例,首先会调用create方法,然后通过动态代理去拦截网络请求接口当中的生成好的一些方法以及他们的注解,最终会返回一个动态代理对象。
网友评论