Retrofit中的适配器模式
看过Retrofit源码的都知道,CallAdapter部分是项目中不好理解的地方,但是也是代码中最精彩的部分,就这一个地方就包含了适配模式、策略模式、代理模式等,下面先看看其中的适配器模式。
Retrofit是网络请求操作的封装底层还是Okhttp请求,其中Retrofit中网络请求接口Call是和Okhttp连接的地方
public interface Call<T> extends Cloneable {
Response<T> execute() throws IOException;
void enqueue(Callback<T> callback);
boolean isExecuted();
void cancel();
boolean isCanceled();
Call<T> clone();
Request request();
}
Retrofit中有默认的实现OkhttpCall,大家都知道网络请求需要切换线程的,但是现在客户端操作(就是用Retrofit的程序员)结合了RxJava,怎么把OKhttpCall的操作方式转换成RxJava切换线程的方式呢?现在想在Android平台上面用,怎么把OkhttpCall的操作方式转换成Android平台下Handler切换线程的方式呢?如果以后还想扩展其他平台呢?那么用了Adapter适配器模式可以很好的解决这个问题!
1、如果用了RxJava那么就会使用RxJavaCallAdapterFactory,这个里面是怎么转换线程的呢(RxJavaCallAdapterFactory本身内部getCallAdapter中用到了策略模式),可以看到里面的SimpleCallAdapter内部类有一个adapt方法就是把OkhttpCall的方式转换成RxJava的方式.
2、如果在Android默认平台下就会使用ExecutorCallAdapterFactory,这个里面用到了Handler来切换线程,首先内部类ExecutorCallbackCall(本身自己就是静态代理模式)中实现了切换线程,ExecutorCallbackCall中的callbackExecutor就是
static class MainThreadExecutor implements Executor {
private final Handler handler = new Handler(Looper.getMainLooper());
@Override public void execute(Runnable r) {
handler.post(r);
}
}
3、如果是Java8平台那么就会使用Java8CallAdapterFactory,这个里面就会使用CompletableFuture来切换线程.
@Override public CompletableFuture<R> adapt(final Call<R> call) {
final CompletableFuture<R> future = new CompletableFuture<R>() {
@Override public boolean cancel(boolean mayInterruptIfRunning) {
if (mayInterruptIfRunning) {
call.cancel();
}
return super.cancel(mayInterruptIfRunning);
}
};
call.enqueue(new Callback<R>() {
@Override public void onResponse(Call<R> call, Response<R> response) {
if (response.isSuccessful()) {
future.complete(response.body());
} else {
future.completeExceptionally(new HttpException(response));
}
}
@Override public void onFailure(Call<R> call, Throwable t) {
future.completeExceptionally(t);
}
});
return future;
}
}
总结:Retrofit中用了适配器模式把OkHttpCall轻松适配到了RxJava的Observable、Android的ExecutorCallbackCall、Java8的CompletableFuture,当然还有一个Guava,如果以后要扩展就可以在继续适配就行,非常容易扩展!!