Retrofit源码中加深HTTP
通过 Retrofit.create(Class) 方法创建出 Service interface 的实例,从 而使得 Service 中配置的方法变得可用,这是 Retrofit 代码结构的核心;
Retrofit.create() 方法内部,使用的是
Proxy.newProxyInstance() 方法来创建 Service 实例。这个方法会为参 数中的多个 interface (具体到 Retrofit 来说,是固定传入一个 interface)创建 一个对象,这个对象实现了所有 interface 的每个方法,并且每个方法的实现都 是雷同的:调用对象实例内部的一个 InvocationHandler 成员变量的
invoke() 方法,并把自己的方法信息传递进去。这样就在实质上实现了代理 逻辑:interface 中的方法全部由一个另外设定的 InvocationHandler 对象 来进行代理操作。并且,这些方法的具体实现是在运行时生成 interface 实例时 才确定的,而不是在编译时(虽然在编译时就已经可以通过代码逻辑推断出 来)。这就是网上所说的「动态代理机制」的具体含义。
因此, invoke() 方法中的逻辑,就是 Retrofit 创建 Service 实例的关键。这 个方法内有三行关键代码,共同组成了具体逻辑:
-
ServiceMethod 的创建: loadServiceMethod(method)
这行代码负责读取 interface 中原方法的信息(包括返回值类型、方法注解、参 数类型、参数注解),并将这些信息做初步分析。实际返回的是一个
CallAdapted 。 -
OkHttpCall 的创建:
OkHttpCall 是 retrofit2.Call 的子类。这行代码负责将 ServiceMethod 解读到的信息(主要是一个 RequestFactory 、一个
OkHttpClient 和一个 ResponseConverter )封装进 OkHttpCall ; 而这个对象可以在需要的时候(例如它的 enqueue() 方法被调用的时候), 利用 RequestFactory 和 OkHttpClient 来创建一个 okhttp3.Call 对象,并调用这个 okhttp3.Call 对象来进行网络请求的发起,然后利用
ResponseConverter 对结果进行预处理之后,交回给 Retrofit 的 Callback 。 -
adapt() 方法:
new OkHttpCall<>(requestFactory, args, callFactory, responseConverter)
callAdapter.adapt(call);
这个方法会使用一个 CallAdapter 对象来把 OkHttpCall 对象进行转换,生成一个新 的对象。默认情况下,返回的是一个 ExecutorCallbackCall ,它的作用是把操 作切回主线程后再交给 Callback 。
另外,如果有自定义的 CallAdapter,这里也可以生成别的类型的对象,例如 RxJava 的 Observable ,来让 Retrofit 可以和 RxJava 结合使用。
网友评论