前言
为面试作准备 ,来学习学习Retrofit的源代码
分析
作为一个Android开发者 ,猜测一下 Retrofit估计也是用的是Handler来进行线程切换的,解析来我们看看源码看他是如何实现的
*/
public Retrofit build() {
if (baseUrl == null) {
throw new IllegalStateException("Base URL required.");
}
okhttp3.Call.Factory callFactory = this.callFactory;
if (callFactory == null) {
callFactory = new OkHttpClient();
}
Executor callbackExecutor = this.callbackExecutor;
if (callbackExecutor == null) {
callbackExecutor = platform.defaultCallbackExecutor();
}
// Make a defensive copy of the adapters and add the default Call adapter.
List<CallAdapter.Factory> callAdapterFactories = new ArrayList<>(this.callAdapterFactories);
callAdapterFactories.addAll(platform.defaultCallAdapterFactories(callbackExecutor));
public Builder() {
this(Platform.get());
}
首先在匿名内部类的build()方法中callExecutor,在Retrofit中就是使用这个对象实现的线程切换,他的初始化是通过platform这个对象来实现的,Platform是通过一个get方法类初始化的
private static final Platform PLATFORM = findPlatform();
static Platform get() {
return PLATFORM;
}
private static Platform findPlatform() {
switch (System.getProperty("java.vm.name")) {
case "Dalvik":
return new Android();
case "RoboVM":
return new Platform(false);
default:
return new Platform(true);
}
}
static final class Android extends Platform {
Android() {
super(Build.VERSION.SDK_INT >= 24);
}
@Override
public Executor defaultCallbackExecutor() {
return new MainThreadExecutor();
}
@Nullable
@Override
Object invokeDefaultMethod(
Method method, Class<?> declaringClass, Object object, Object... args) throws Throwable {
if (Build.VERSION.SDK_INT < 26) {
throw new UnsupportedOperationException(
"Calling default methods on API 24 and 25 is not supported");
}
return super.invokeDefaultMethod(method, declaringClass, object, args);
}
static final class MainThreadExecutor implements Executor {
private final Handler handler = new Handler(Looper.getMainLooper());
@Override
public void execute(Runnable r) {
handler.post(r);
}
}
}
}
在Android平台调用get方法会返回一个Android()对象,可以看到他内部包含了一个MainThreadExecutor 通过该对象内部的handler显示线程的切换,因此在retrofit的Builder的build()内部的 callbackExecutor = platform.defaultCallbackExecutor();
会得到一个MainThreadExecutor
// Make a defensive copy of the adapters and add the default Call adapter.
List<CallAdapter.Factory> callAdapterFactories = new ArrayList<>(this.callAdapterFactories);
callAdapterFactories.addAll(platform.defaultCallAdapterFactories(callbackExecutor));
会通过MainThreadExecutor创建一个DefaultCallAdapterFactory在内部创建一个ExecutorCallbackCall对原来的cal进行代理在请求成功的时候通过MainThreadExecutor进行线程切换,代码如下
return new CallAdapter<Object, Call<?>>() {
@Override
public Type responseType() {
return responseType;
}
@Override
public Call<Object> adapt(Call<Object> call) {
return executor == null ? call : new ExecutorCallbackCall<>(executor, call);
}
};