Retrofit原理(面试)

·  大概原理
通过java接口以及注解来描述网络请求,并用动态代理的方式,在调用接口方法前后(beforeafter)注入自己的方法,before通过接口方法和注解生成网络请求的requestafter通过client调用相应的网络框架(默认okhttp)去发起网络请求,并将返回的response通过converterFactorty转换成相应的数据model,最后通过calladapter转换成其他数据方式(如rxjava Observable

·  动态代理
代理对象拦截真实对象的方法调用,在真实对象调用前/后实现自己的逻辑调用
Retrofit.create()方法

·  重点类
1.Retrofit类 创建接口api的动态代理对象(create()返回api service动态代理对象,调用代理对象上的方法时,会触发代理对象上的invoke方法,这里面会封装好OKHttpCall对象,OKHttpCall的数据返回根据calladapter转换为Observable
2.ServiceMethod 核心处理类,解析方法和注解,生成HttpRequesttoRequest方法;创建responseConverter(将response流转换为String或者实体类); 创建callAdapter(转换为rxjava observable
3.OKHttpCall 封装okhttp3的调用

4.Rxjava2CallAdapter 转换成Observable BodyObservable会对http code做检查,如果错误直接走onError流程)


或者

1. 通过建造者模式构建一个Retrofit实例,配置baseUrlcallAdapterFactory(将代理返回的Call对象转化为其他,比如RxjavaObserver),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相结合,使用起来更加简便。


猜你喜欢

转载自blog.csdn.net/ActiveLi/article/details/80610031