欢迎来到DIVCSS5查找CSS资料与学习DIV CSS布局技术!
简述retrofit的使用,通过使用方式逐步分析源码;(**前方多图**)
 
创建retrofit对象,通过new Retrofit.Builder().build(); 这里使用了建造者模式,Builder作为Retrofit的静态内部类,类中方法遵循链式调用规则(即方法return this),例如:
 
Retrofit.Builder中的方法截图
 
Builder()的无参构造函数中,创建Platform对象,Platform有两个内部类子类:Java8, Android;我在Android中使用,所以Builder中创建的是Android对象;Builder.build方法是创建Retrofit对象,主要创建CallFactory,CallAdapter.Factory,Converter.Factory对象,并作为参数创建Retrofit;如下图红线部分,接下来会用到;
 
创建Retrofit
 
CallAdapter.Factory -> ExecutorCallAdapterFactory
 
2. 获取自定义接口实例对象;通过IHttp ihttp = retrofit.create(IHttp.class);
 
IHttp
 
这里用到了动态代理模式,method.getDeclaringClass()返回IHttp中post的返回值类型;
 
通过动态代理返回接口对象
 
loadServiceMethod(method)
 
3. 调用接口的方法ihttp.post(),执行网络请求;源码中执行到proxy.invoke(); 加载ServiceMethod,执行serviceMethod.invoke();
 
ServiceMethod是抽象类,子类是HttpServiceMethod; 同样通过建造者模式获取HttpServiceMethod对象;
 
ServiceMethod.java
 
HttpServiceMethod建造者模式
 
HttpServiceMethod.java
 
Retrofit.java
 
ExecutorCallAdapterFactory.java
 
HttpServiceMethod.java
 
HttpServiceMethod.java
 
BuiltInConverters.java
 
与retrofit的建造者模式不同之处是,retrofit的构造函数是具体的每个参数,而HttpServiceMethod的构造函数形参是Builder对象;
 
执行serviceMethod.invoke方法,callAdapter是ExecutorCallAdapterFactory.get()返回的对象,adapt返回Call接口对象,实现类为ExecutorCallbackCall; 这个Call对象返回给开发者,开发者拿到call后,执行同步/异步网络请求;
 
HttpServiceMethod
 
ExecutorCallAdapterFactory.java
 
我使用的异步请求,调用enqueue方法
 
ExecutorCallAdapterFactory.ExecutorCallbackCall
 
上图中,delegate是OkHttpCall对象,这里获取okhttp3.Call对象;
 
OkHttpCall.java
 
OkHttpCall.java
 
callFactory就是OkHttpClient,见Retrofit.Builder().build()方法;RequestFactory通过parseAnnotations()解析开发者自定义的方法和形参的注解;
 
OkHttpCall.enqueue方法片段
 
通过okhttp3.Call.enqueue执行网络请求,callback为ExecutorCallAdapterFactory.ExecutorCallbackCall 中delegate.enqueue传入的。剩下的就是多次的回调了,至此一次网络请求,retrofit执行的流程已梳理完毕。

如需转载,请注明文章出处和来源网址:http://www.divcss5.com/html/h63253.shtml