Retrofit 对象的创建采用了 Builder 模式,创建的产品就是 Retrofit 对象,而开发者在这过程中扮演的就是导演角色,来明确要组件哪些配置来创建出这个产品。
//最简单的应该像这样,所有都采用默认的配置
Retrofit retrofit = new Retrofit.Builder().build();
实际项目中通常会有这么几个需要配置,
- Converter.Factory
- CallAdapter.Factory
- baseUrl
- client
创建 Retrofit 对象的作用其实是为了后续的接口请求。我们知道接口请求的代码是写在了一个接口文件里,一个个请求就对应一个个带着请求注解的方法。表面上看我们并没有实现请求的具体细节,但这其实都交给了 Retrofit 的 create 方法来完成了。
public <T> T create(final Class<T> service) {
return (T)
Proxy.newProxyInstance(
service.getClassLoader(),
new Class<?>[] {service},
new InvocationHandler() {
private final Platform platform = Platform.get();
private final Object[] emptyArgs = new Object[0];
@Override
public @Nullable Object invoke(Object proxy, Method method, @Nullable Object[] args) throws Throwable {
if (method.getDeclaringClass() == Object.class) {
return method.invoke(this, args);
}
args = args != null ? args : emptyArgs;
return platform.isDefaultMethod(method)
? platform.invokeDefaultMethod(method, service, proxy, args)
: loadServiceMethod(method).invoke(args);
}
});
}
create 方法里主要工作就是通过动态代理创建了刚才说的请求接口类的实现类。InvocationHandler 是 JDK 提供的用于实现动态代理的接口,其重点在于 invoke 方法的实现。动态代理的工作就是利用我们提供的接口文件,动态代理机制帮我们生成接口实现类,自然,接口方法也就实现了,回过头看 Retrofit 就是这么要求的。
Proxy.newProxyInstance();
这句是动态代理的固定写法,用于创建一个对象,第一个入参用于获取 ClassLoader 对象,第二个入参用于获取所有接口,因为 create 方法入参本身要求时接口,所以写法上和普通的不太一样,一般情况下,接口可以用 getInterfaces 方法获取,最后一个入参就是 InvocationHandler 的匿名内部类了。
创建的对象就是接口实现类对象,而接口里定义的方法最终实现是交给了 invoke 方法,所以可以这么理解,调用接口方法,最终都会在 invoke 方法里执行。
关于动态代理还有一个概念,叫 AOP,它的核心就是动态代理,作用是可以在现有的项目框架设计或实现基础之上做日志,事务,权限等功能的附加。
有了接口实现类对象后,理论上就可以完成网络请求了,只是写起来并没有那么方便,对于同步和异步的请求要自己管理子线程与主线程。后面会对以上内容做更详细的的分析。
网友评论