1、Retrofit是什么?
准确来说,
Retrofit 是一个 RESTful 的 HTTP 网络请求框架的封装。`
原因:
网络请求的工作本质上是 OkHttp 完成,而 Retrofit 仅负责 网络请求接口的封装。
流程.png
上图说明了如下几点:
- App应用程序通过 Retrofit 请求网络,实际上是使用 Retrofit 接口层封装请求参数、Header、Url 等信息,之后由 OkHttp 完成后续的请求操作。
- 在服务端返回数据之后,OkHttp 将原始的结果交给 Retrofit,Retrofit根据用户的需求对结果进行解析。
注意:Retrofit 通过 java 接口以及注解来描述网络请求,并用动态代理的方式生成网络请求的 request,然后通过 client 调用相应的网络框架(默认 okhttp)去发起网络请求,并将返回的 response 通过 converterFactorty 转换成相应的数据 model,最后通过 calladapter 转换成其他数据方式(如 rxjava Observable)
2、Retrofit 流程
- 1、添加Retrofit依赖,网络权限
- 2、定义接收服务器返回数据的Bean
- 3、创建网络请求的接口,使用注解(动态代理,核心)
- 4、 builder模式创建Retrofit实例,converter,calladapter…
- 5、创建接口实例,调用具体的网络请求
- 6、call同步/异步网络请求
- 7、处理服务器返回的数据
3、Retrofit 优点
- 可以配置不同 HTTP client 来实现网络请求,如 okhttp、httpclient 等;
- 请求的方法参数注解都可以定制;
- 支持同步、异步和 RxJava;
- 超级解耦;
- 可以配置不同的反序列化工具来解析数据,如 json、xml 等
- 框架使用了很多设计模式
4、Retrofit 中的数据究竟是怎么处理的?它是怎么返回 RxJava.Observable 的?
Retrofit 中的数据其实是交给了 callAdapter 以及 converter 去处理,callAdapter 负责把 okHttpCall 转成我们所需的 Observable 类型, converter 负责把服务器返回的数据转成具体的实体类。
5、动态代理和静态代理的区别?
- 1、静态代理类由程序员创建或工具生成代理类的源码,再编译代理类。所谓静态也就是在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了。
- 2、动态代理类是在程序运行期间由 JVM 根据反射等机制动态的生成,所以不存在代理类的字节码文件。代理类和委托类的关系是在程序运行时确定。
6、使用的设计模式
- 外观模式,
- 构建者模式,
- 工厂模式,
- 代理模式,
- 适配器模式,
- 策略模式,
- 装饰模式,
- 1、Retrofit 实例使用
建造者模式
通过Builder类构建。 当构造函数的参数大于4个,且存在可选参数的时候既可以使用建造者设计模式
- 2、Retrofit 创建时的callFactory,使用
工厂方法设计模式
,但是似乎并不打算支持其他的工厂。- 3、整个retrofit 采用的时
外观模式
。统一的调用创建网络请求接口实例和网络请求参数配置的方法- 4、retrofit里面使用了
动态代理
来创建网络请求接口实例,这个是retrofit对用户使用来说最大的复用,其它的代码都是为了支撑这个动态代理给用户带来便捷性的- 5、使用了
策略模式
对serviceMethod对象进行网络请求参数配置,即通过解析网络请求接口方法的参数、返回值和注解类型,从Retrofit对象中获取对应的网络的url地址、网络请求执行器、网络请求适配器和数据转换器- 6、ExecuteCallBack 使用
装饰者模式
来封装callbackExecutor,用于完成线程的切换- 7、ExecutorCallbackCall 使用
静态代理
(委托) 代理了Call进行网络请求,真正的网络请求由okhttpCall执行,然而okHttpCall不是自己执行,它是okhttp 提供call给 外界(retrofit)使用的唯一门户,其实这个地方就是门面模式
- 8、ExecutorCallbackCall 的被初始化是在 ExecutorCallAdapterFactory里面通过适配器模式被创建的。CallAdapter采用了
适配器模式
为创建访问Call接口提供服务。默认不添加Rxjava则使用默认的ExecutorCallAdapterFactory 将okhttp3.call转变成为 retroift中的call,如果有Rxjava则将okhttp3.call转化为abservable。
7、Retrofit 如何切换线程的?
// 代码2
// 添加一个线程管理 Executor,okhttp 切换线程需要手动操作,但是retrofit 不需要,就是因为这个Executor 的存在,其实他是handler
Executor callbackExecutor = this.callbackExecutor;
if (callbackExecutor == null) {
callbackExecutor = platform.defaultCallbackExecutor();
}
网络请求需要在子线程中执行,那么就需要线程管理,所以就有了代码2的存在,深入源码后发现,这个地方就是运用handler进行线程切换,当网络请求回来了进行线程切换,可以看下面的源码
static final class Android extends Platform {
Android() {
super(Build.VERSION.SDK_INT >= 24);
}
@Override
public Executor defaultCallbackExecutor() {
return new MainThreadExecutor();
}
static class MainThreadExecutor implements Executor {
private final Handler handler = new Handler(Looper.getMainLooper());
@Override public void execute(Runnable r) {
handler.post(r);
}
}
}
网友评论