Retrofit主要是在create方法中采用动态代理模式实现接口方法;这个过程构建了一个ServiceMethod对象,根据方法注解获取请求方式、参数类型、参数注解,而后拼接网络请求的连接;当咱们主动发起网络请求的时候会调用okhttp发起网络请求,okhttp的配置包括请求方式、URL等在Retrofit的RequestBuilder的build()方法中实现,并发起真正的网络请求。java
大概原理
经过java接口以及注解来描述网络请求,并用动态代理的方式,在调用接口方法先后(before/after)注入本身的方法,before经过接口方法和注解生成网络请求的request,after经过client调用相应的网络框架(默认okhttp)去发起网络请求,并将返回的response经过converterFactorty转换成相应的数据model,最后经过calladapter转换成其余数据方式(如rxjava Observable)api
· 动态代理
代理对象拦截真实对象的方法调用,在真实对象调用前/后实现本身的逻辑调用
见Retrofit.create()方法缓存
· 重点类
1.Retrofit类: 建立接口api的动态代理对象(create()返回api service动态代理对象,调用代理对象上的方法时,会触发代理对象上的invoke方法,这里面会封装好OKHttpCall对象,OKHttpCall的数据返回根据calladapter转换为Observable)
2.ServiceMethod类: 解析方法和注解,生成HttpRequest(toRequest方法;建立responseConverter(将response流转换为String或者实体类); 建立callAdapter(转换为rxjava observable)
3.OKHttpCall: 封装okhttp3的调用网络
4.Rxjava2CallAdapter: 转换成Observable (BodyObservable会对http code作检查,若是错误直接走onError流程) 架构
或者并发
1. 经过建造者模式构建一个Retrofit实例,配置baseUrl,callAdapterFactory(将代理返回的Call对象转化为其余,好比Rxjava的Observer),converterFactory(结果的转化器,将请求的结果转化为特定的对象时使用,好比GsonConverterFactory)框架
2.经过Retrofit对象的create(Class<T> service)方法返回一个Service的动态代理对象,在调用service的方法的时候,就是调用动态代理的invoke方法。
3.调用代理的invoke方法的时候,会将method进行解析,解析咱们在接口里面配置的各类注解,最后构形成ServiceMethod对象,并将结果缓存起来,下次再次调用就不用解析了。ServiceMethod对象能够生成Request对象,因此将ServiceMethod对象注入到OkHttpCall,而后经过callAdapter转化为用户但愿获得的返回对象,默认是直接返回Call对象。
4.返回Call对象以后,咱们再调用execute或者enqueue方法,前者是同步请求,后者是异步请求,再方法里面会调用Okhttp的网络请求方法。异步
综上所述,Retrofit就是一个封装了Http请求的框架,底层的网络请求都是使用的Okhttp,自己只是简化了用户网络请求的参数配置等,还能与Rxjava相结合,使用起来更加简便。
---------------------
做者:ActiveLi
来源:CSDN
原文:https://blog.csdn.net/ActiveLi/article/details/80610031
版权声明:本文为博主原创文章,转载请附上博文连接!ui