Retrofit中的適配器模式
看過Retrofit源碼的都知道,CallAdapter部分是項目中不好理解的地方,但是也是代碼中最精彩的部分,就這一個地方就包含了適配模式、策略模式、代理模式等,下面先看看其中的適配器模式。
Retrofit是網(wǎng)絡(luò)請求操作的封裝底層還是Okhttp請求,其中Retrofit中網(wǎng)絡(luò)請求接口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中有默認(rèn)的實現(xiàn)OkhttpCall,大家都知道網(wǎng)絡(luò)請求需要切換線程的,但是現(xiàn)在客戶端操作(就是用Retrofit的程序員)結(jié)合了RxJava,怎么把OKhttpCall的操作方式轉(zhuǎn)換成RxJava切換線程的方式呢?現(xiàn)在想在Android平臺上面用,怎么把OkhttpCall的操作方式轉(zhuǎn)換成Android平臺下Handler切換線程的方式呢?如果以后還想擴展其他平臺呢?那么用了Adapter適配器模式可以很好的解決這個問題!
1、如果用了RxJava那么就會使用RxJavaCallAdapterFactory,這個里面是怎么轉(zhuǎn)換線程的呢(RxJavaCallAdapterFactory本身內(nèi)部getCallAdapter中用到了策略模式),可以看到里面的SimpleCallAdapter內(nèi)部類有一個adapt方法就是把OkhttpCall的方式轉(zhuǎn)換成RxJava的方式.
2、如果在Android默認(rèn)平臺下就會使用ExecutorCallAdapterFactory,這個里面用到了Handler來切換線程,首先內(nèi)部類ExecutorCallbackCall(本身自己就是靜態(tài)代理模式)中實現(xiàn)了切換線程,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;
}
}
總結(jié):Retrofit中用了適配器模式把OkHttpCall輕松適配到了RxJava的Observable、Android的ExecutorCallbackCall、Java8的CompletableFuture,當(dāng)然還有一個Guava,如果以后要擴展就可以在繼續(xù)適配就行,非常容易擴展!!