1 簡介
提供給使用者的接口類:Retrofit
Retrofit用註解的方式爲HTTP接口適配了帶有回調的java接口,通過這些java接口可以實現HTTP請求。
本文Retrofit版本:2.6.0
2 Retrofit組成:
2.1 Builder: Retrofit構建器(Builder模式)
作用:在保證Retrofit有默認組件的情況下,方便使用者自定義相關Retrofit組件。
小細節Platform:
Builder也可以配置Platform,默認情況下,Bulder會自動獲取對應的平臺。
private static Platform findPlatform() {
try {
Class.forName("android.os.Build");
if (Build.VERSION.SDK_INT != 0) {
return new Android();
}
} catch (ClassNotFoundException ignored) {
}
try {
Class.forName("java.util.Optional");
return new Java8();
} catch (ClassNotFoundException ignored) {
}
return new Platform();
}
可以看到有三個平臺,Android(繼承Platform),Java8(繼承Platform)和Platform自己。
下面再看三個平臺區別:
2.1.1 Platform
Platform平臺應該是用來支持java8版本之下的java平臺。
class Platform {
...
// 平臺無回調執行器,應該在哪裏創建的,就在哪裏回調
Executor defaultCallbackExecutor() {
return null;
}
// 平臺默認的回調適配器工廠列表爲new DefaultCallAdapterFactory(callbackExecutor)
List<? extends CallAdapter.Factory> defaultCallAdapterFactories(
@Nullable Executor callbackExecutor) {
return singletonList(new DefaultCallAdapterFactory(callbackExecutor));
}
// 默認回調適配器工廠數量爲1
int defaultCallAdapterFactoriesSize() {
return 1;
}
// 默認的轉換器工廠列表爲空列表
List<? extends Converter.Factory> defaultConverterFactories() {
return emptyList();
}
// 是否是默認方法
boolean isDefaultMethod(Method method) {
return false;
}
// 調用指定類默認的方法會拋異常,即不支持調用非默認方法
@Nullable Object invokeDefaultMethod(Method method, Class<?> declaringClass, Object object,
@Nullable Object... args) throws Throwable {
throw new UnsupportedOperationException();
}
...
}
- isDefaultMethod()返回false,表示傳入的Method都告知不是默認方法(默認方法是一種公共的非抽象實例方法,即帶有主體的非靜態方法,在接口中聲明)
- invokeDefaultMethod返回異常,表示調用非默認方法不支持
2.1.2 Android
static class Android extends Platform {
// 平臺默認的回調執行器 可以看出默認的回調線程是UI線程,所以使用者不用在回調裏做線程切換
@Override public Executor defaultCallbackExecutor() {
return new MainThreadExecutor();
}
// 是否是默認方法
@Override boolean isDefaultMethod(Method method) {
// 如果安卓構建版本小於24(安卓7.0),則直接返回是非默認方法,否則正常返回method.isDefault()
if (Build.VERSION.SDK_INT < 24) {
return false;
}
return method.isDefault();
}
//回調執行器必須不爲空,回調適配器工廠列表版本小於Android7返回new DefaultCallAdapterFactory(callbackExecutor)單獨組成的不可變list,否則返回CompletableFutureCallAdapterFactory.INSTANCE和DefaultCallAdapterFactory(callbackExecutor)組成的不可變list
@Override List<? extends CallAdapter.Factory> defaultCallAdapterFactories(
@Nullable Executor callbackExecutor) {
if (callbackExecutor == null) throw new AssertionError();
DefaultCallAdapterFactory executorFactory = new DefaultCallAdapterFactory(callbackExecutor);
// CompletableFutureCallAdapterFactory是支持CompletableFutureCall,是java8特性
return Build.VERSION.SDK_INT >= 24
? asList(CompletableFutureCallAdapterFactory.INSTANCE, executorFactory)
: singletonList(executorFactory);
}
// 默認的回調適配器工程個數,和defaultCallAdapterFactories對應
@Override int defaultCallAdapterFactoriesSize() {
return Build.VERSION.SDK_INT >= 24 ? 2 : 1;
}
// 默認的轉換器工廠
@Override List<? extends Converter.Factory> defaultConverterFactories() {
// 如果平臺支持java8,則讓Converter支持java8操作符
return Build.VERSION.SDK_INT >= 24
? singletonList(OptionalConverterFactory.INSTANCE)
: Collections.<Converter.Factory>emptyList();
}
// 默認轉換器工廠個數
@Override int defaultConverterFactoriesSize() {
return Build.VERSION.SDK_INT >= 24 ? 1 : 0;
}
//安卓平臺的主線程執行器
static class MainThreadExecutor implements Executor {
private final Handler handler = new Handler(Looper.getMainLooper());
@Override public void execute(Runnable r) {
handler.post(r);
}
}
}
Android有默認的MainThreadExecutor,就是Android主線程任務執行器,默認的CallAdapter.Factory任務回調適配器工廠。
從這裏就可以看出Android平臺上,Retrofit執行任務默認是在主線程。
2.1.3 java8
static class Java8 extends Platform {
// 默認method.isDefault()
@Override boolean isDefaultMethod(Method method) {
return method.isDefault();
}
// 支持調用默認方法
@Override Object invokeDefaultMethod(Method method, Class<?> declaringClass, Object object,
@Nullable Object... args) throws Throwable {
// Because the service interface might not be public, we need to use a MethodHandle lookup
// that ignores the visibility of the declaringClass.
Constructor<Lookup> constructor = Lookup.class.getDeclaredConstructor(Class.class, int.class);
constructor.setAccessible(true);
return constructor.newInstance(declaringClass, -1 /* trusted */)
.unreflectSpecial(method, declaringClass)
.bindTo(object)
.invokeWithArguments(args);
}
// 默認適配器工廠列表,和Android差不多
@Override List<? extends CallAdapter.Factory> defaultCallAdapterFactories(
@Nullable Executor callbackExecutor) {
List<CallAdapter.Factory> factories = new ArrayList<>(2);
factories.add(CompletableFutureCallAdapterFactory.INSTANCE);
factories.add(new DefaultCallAdapterFactory(callbackExecutor));
return unmodifiableList(factories);
}
// 默認適配器工廠個數
@Override int defaultCallAdapterFactoriesSize() {
return 2;
}
// 默認轉換器工廠列表
@Override List<? extends Converter.Factory> defaultConverterFactories() {
return singletonList(OptionalConverterFactory.INSTANCE);
}
// 默認轉換器工廠個數
@Override int defaultConverterFactoriesSize() {
return 1;
}
}
- isDefaultMethod():返回method.isDefault()
- invokeDefaultMethod():調用非默認方法接口。
總結一下:
平臺 | 默認回調執行器 | 默認回調適配器工廠 | 默認轉換器工廠 | 判斷methos是默認方法 | Object invokeDefaultMethod() |
---|---|---|---|---|---|
Platform | 無 | DefaultCallAdapterFactory(callbackExecutor) | 無 | false | 不支持 |
Java8 | 無 | DefaultCallAdapterFactory(callbackExecutor)和CompletableFutureCallAdapterFactory.INSTANCE | OptionalConverterFactory.INSTANCE | method.isDefault() | 支持 |
Android | MainThreadExecutor | 一個DefaultCallAdapterFactory(callbackExecutor)或者DefaultCallAdapterFactory(callbackExecutor)和CompletableFutureCallAdapterFactory.INSTANCE | OptionalConverterFactory.INSTANCE | SDK_INT< 24 ? false:method.isDefault() | 不支持 |
2.2 合成Retrofit的組件:
Retrofit是一個門面,這個門面通過組合各種組件來爲使用者提供API。以下就是合成Retrofit的必要組件:
-
callFactory:okhttp3.Call.Factory
生成(HTTP調用對象)的工廠 -
baseUrl:HttpUrl
HTTP url相關 converterFactories:List<Converter.Factory>
adapterFactories:List<CallAdapter.Factory>
callbackExecutor: Executor
validateEagerly: boolean
2.2.1 okhttp3.Call.Factory
http調用(call)工廠,就是生產http調用對象的工廠
可以看看okhttp3.Call接口
// 表示單個請求/響應,不能執行兩次,它是可以取消的。
public interface Call extends Cloneable {
// 返回發起請求回調的Request
Request request();
// 同步執行
Response execute() throws IOException;
// 異步執行
void enqueue(Callback responseCallback);
// 取消
void cancel();
// 是否已執行
boolean isExecuted();
// 是否已取消
boolean isCanceled();
// 克隆方法
Call clone();
// 工廠接口
interface Factory {
// 工廠方法
Call newCall(Request request);
}
}
如果你使用過OkHttp3,會發現這就是OkHttp3常用的外部接口。所以OkHttpClient就是它的一個實現。所以Retrofit框架裏沒有自己擴展Call.Factory,那麼默認工廠就是用的OkHttp3框架裏實現的OkHttpClient。
okhttp3.Call.Factory callFactory = this.callFactory;
if (callFactory == null) {
callFactory = new OkHttpClient();
}
上面取自Retrofit.Builder.build()裏的代碼,可以看到如果用戶沒有指定自定義的okhttp3.Call.Factory,那麼默認就是用OkHttpClient。
2.2.2 baseUrl:HttpUrl
HttpUrl對象可通過HttpUrl.Build對象的parse()方法構造。HttpUrl包含一個Http Url的組成信息,比如域名,端口,用戶名,密碼等都可以設置。
HttpUrl就是Retrofit的基地址,它可以通過HttpUrl.parse(String baseUrl)的匹配校驗生成一個HttpUrl對象。
例:
/**
* Set the API base URL.
*
* @see #baseUrl(HttpUrl)
*/
public Builder baseUrl(String baseUrl) {
checkNotNull(baseUrl, "baseUrl == null");
return baseUrl(HttpUrl.get(baseUrl));
}
public Builder baseUrl(HttpUrl baseUrl) {
checkNotNull(baseUrl, "baseUrl == null");
List<String> pathSegments = baseUrl.pathSegments();
if (!"".equals(pathSegments.get(pathSegments.size() - 1))) {
throw new IllegalArgumentException("baseUrl must end in /: " + baseUrl);
}
this.baseUrl = baseUrl;
return this;
}
上面取自Retrofit.Builder.build()裏的代碼,可以得知我們通常set的地址,最後會轉化成一個HttpUrl對象。
2.2.3 converterFactories:List<Converter.Factory>
Converter是從一個對象轉爲另一種對象過程的抽象,簡明一點就叫轉換器。比如說你總要把用戶的請求信息轉爲OkHttp標準的請求結構(Request),或者是OkHttp的標準響應信息(Response)轉爲用戶數據。
把它抽象爲一個接口,接口裏就有一個convert方法
public interface Converter<F, T> {
// T是目標類型,F是原始類型
T convert(F value) throws IOException;
}
然而Converter又可以是多種多樣的,這樣就最好是用工廠類來生產:
abstract class Factory {
// 生產responseBody轉換器
public @Nullable Converter<ResponseBody, ?> responseBodyConverter(Type type,
Annotation[] annotations, Retrofit retrofit) {
return null;
}
// 目標爲RequestBody的轉換器 type爲原始類型的type,parameterAnnotations爲參數上的註解(因爲支持Body,Part,PartMap註解),methodAnnotations爲方法註解,retrofit是門面
public @Nullable Converter<?, RequestBody> requestBodyConverter(Type type,
Annotation[] parameterAnnotations, Annotation[] methodAnnotations, Retrofit retrofit) {
return null;
}
// 生產目標爲String類型的轉換器
public @Nullable Converter<?, String> stringConverter(Type type, Annotation[] annotations,
Retrofit retrofit) {
return null;
}
// 泛型參數type的指定位置參數的上限,比如Map<? extends String,Long>這個type索引位置0參數的type的上限爲String,1爲Long
protected static Type getParameterUpperBound(int index, ParameterizedType type) {
return Utils.getParameterUpperBound(index, type);
}
// 一般用於獲取泛型參數前的type,比如List<String>會返回List.class
protected static Class<?> getRawType(Type type) {
return Utils.getRawType(type);
}
}
想要轉換肯定要知道原始類型和目標類型,所以可以從生成方法中的參數
Retrofit庫已經爲我們實現了很多Converter,如下圖:
常用的GsonConverterFactory實現:
public final class GsonConverterFactory extends Converter.Factory {
// 實例化一個GsonConverterFactory
public static GsonConverterFactory create() {
return create(new Gson());
}
public static GsonConverterFactory create(Gson gson) {
if (gson == null) throw new NullPointerException("gson == null");
return new GsonConverterFactory(gson);
}
private final Gson gson;
// 構造方法
private GsonConverterFactory(Gson gson) {
this.gson = gson;
}
// 把ResponseBody轉爲指定類型對象
@Override
public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations,
Retrofit retrofit) {
TypeAdapter<?> adapter = gson.getAdapter(TypeToken.get(type));
return new GsonResponseBodyConverter<>(gson, adapter);
}
// 把指定類型轉爲RequestBody
@Override
public Converter<?, RequestBody> requestBodyConverter(Type type,
Annotation[] parameterAnnotations, Annotation[] methodAnnotations, Retrofit retrofit) {
TypeAdapter<?> adapter = gson.getAdapter(TypeToken.get(type));
return new GsonRequestBodyConverter<>(gson, adapter);
}
}
Gson是怎麼解析的?
GsonRequestBodyConverter類裏:
// 這裏實際也就是把對象轉爲Json字符串寫入到RequestBody裏而已。
@Override public RequestBody convert(T value) throws IOException {
Buffer buffer = new Buffer();
Writer writer = new OutputStreamWriter(buffer.outputStream(), UTF_8);
JsonWriter jsonWriter = gson.newJsonWriter(writer);
adapter.write(jsonWriter, value);
jsonWriter.close();
return RequestBody.create(MEDIA_TYPE, buffer.readByteString());
}
使用Gson的jsonWriter配合TypeAdapter寫入Buffer,然後構造RequestBody。
GsonResponseBodyConverter<T>類裏:
final class GsonResponseBodyConverter<T> implements Converter<ResponseBody, T> {
private final Gson gson;
private final TypeAdapter<T> adapter;
GsonResponseBodyConverter(Gson gson, TypeAdapter<T> adapter) {
this.gson = gson;
this.adapter = adapter;
}
// 就是把body裏面的Json字符串讀出來然後轉爲指定類型的對象
@Override public T convert(ResponseBody value) throws IOException {
JsonReader jsonReader = gson.newJsonReader(value.charStream());
try {
T result = adapter.read(jsonReader);
if (jsonReader.peek() != JsonToken.END_DOCUMENT) {
throw new JsonIOException("JSON document was not fully consumed.");
}
return result;
} finally {
value.close();
}
}
}
2.2.4 adapterFactories:List<CallAdapter.Factory> 適配器工廠
功能:將默認的網絡請求執行器(OkHttpCall)轉換成適合被不同平臺來調用的網絡請求執行器形式,相當於返回一個代理。
CallAdapter.java
// R爲原始響應Java對象類型,T爲目標響應類型
public interface CallAdapter<R, T> {
// 返回想要響應轉成的Java對象類型
Type responseType();
// 返回一個call的代理
T adapt(Call<R> call);
}
對應的工廠類:其實跟前面的轉換器差不多
abstract class Factory {
// 返回一個回調適配器
public abstract @Nullable CallAdapter<?, ?> get(Type returnType, Annotation[] annotations,
Retrofit retrofit);
// 獲取容器指定索引位置的存放值類型
protected static Type getParameterUpperBound(int index, ParameterizedType type) {
return Utils.getParameterUpperBound(index, type);
}
// 獲取原始Class
protected static Class<?> getRawType(Type type) {
return Utils.getRawType(type);
}
}
}
同樣的Retrofit也爲我們實現了幾個現成的適配器工廠
DefaultCallAdapterFactory 默認的Call適配器工廠
重寫get():
@Override public @Nullable CallAdapter<?, ?> get(
Type returnType, Annotation[] annotations, Retrofit retrofit) {
// 若返回類型Type不是Call.class,返回適配器null
if (getRawType(returnType) != Call.class) {
return null;
}
// 返回類型Type必須爲帶泛型參數的Type
if (!(returnType instanceof ParameterizedType)) {
throw new IllegalArgumentException(
"Call return type must be parameterized as Call<Foo> or Call<? extends Foo>");
}
// 取得返回類型的泛型參數第一個參數的Type實例
final Type responseType = Utils.getParameterUpperBound(0, (ParameterizedType) returnType);
// 獲取回調執行器
final Executor executor = Utils.isAnnotationPresent(annotations, SkipCallbackExecutor.class)
? null
: callbackExecutor;
return new CallAdapter<Object, Call<?>>() {
@Override public Type responseType() {
// 適配器適配的類型Type
return responseType;
}
@Override public Call<Object> adapt(Call<Object> call) {
// 適配器適配後的對象
return executor == null
? call
: new ExecutorCallbackCall<>(executor, call);
}
};
}
擴展Call:代替原來的call,將原call的一些方法放在指定的執行器執行
static final class ExecutorCallbackCall<T> implements Call<T> {
// 回調執行器
final Executor callbackExecutor;
// 我理解爲原始call,但不知道這裏爲什麼要命名爲delegate,獲取是把原對象看作代理吧
final Call<T> delegate;
ExecutorCallbackCall(Executor callbackExecutor, Call<T> delegate) {
this.callbackExecutor = callbackExecutor;
this.delegate = delegate;
}
@Override public void enqueue(final Callback<T> callback) {
checkNotNull(callback, "callback == null");
delegate.enqueue(new Callback<T>() {
@Override public void onResponse(Call<T> call, final Response<T> response) {
callbackExecutor.execute(new Runnable() {
@Override public void run() {
if (delegate.isCanceled()) {
// Emulate OkHttp's behavior of throwing/delivering an IOException on cancellation.
callback.onFailure(ExecutorCallbackCall.this, new IOException("Canceled"));
} else {
callback.onResponse(ExecutorCallbackCall.this, response);
}
}
});
}
@Override public void onFailure(Call<T> call, final Throwable t) {
callbackExecutor.execute(new Runnable() {
@Override public void run() {
callback.onFailure(ExecutorCallbackCall.this, t);
}
});
}
});
}
@Override public boolean isExecuted() {
return delegate.isExecuted();
}
@Override public Response<T> execute() throws IOException {
return delegate.execute();
}
@Override public void cancel() {
delegate.cancel();
}
@Override public boolean isCanceled() {
return delegate.isCanceled();
}
@SuppressWarnings("CloneDoesntCallSuperClone") // Performing deep clone.
@Override public Call<T> clone() {
return new ExecutorCallbackCall<>(callbackExecutor, delegate.clone());
}
@Override public Request request() {
return delegate.request();
}
}
CompletableFutureCallAdapterFactory 支持轉爲ompletableFuture<>的Call適配器工廠
重寫get():
@Override public @Nullable CallAdapter<?, ?> get(
Type returnType, Annotation[] annotations, Retrofit retrofit) {
// 返回類型必須爲CompletableFuture.class
if (getRawType(returnType) != CompletableFuture.class) {
return null;
}
// 返回類型必須爲泛型參數Type
if (!(returnType instanceof ParameterizedType)) {
throw new IllegalStateException("CompletableFuture return type must be parameterized"
+ " as CompletableFuture<Foo> or CompletableFuture<? extends Foo>");
}
// 返回類型第一個參數Type
Type innerType = getParameterUpperBound(0, (ParameterizedType) returnType);
// 如果返回類型第一個參數Type不是Response,則返回BodyCallAdapter
if (getRawType(innerType) != Response.class) {
// Generic type is not Response<T>. Use it for body-only adapter.
return new BodyCallAdapter<>(innerType);
}
// 如果返回類型第一個參數Type是Response,則必須也爲泛型參數化Type
if (!(innerType instanceof ParameterizedType)) {
throw new IllegalStateException("Response must be parameterized"
+ " as Response<Foo> or Response<? extends Foo>");
}
// 返回ResponseCallAdapter實例
Type responseType = getParameterUpperBound(0, (ParameterizedType) innerType);
return new ResponseCallAdapter<>(responseType);
}
BodyCallAdapter :將Call轉爲CompletableFuture<Body>,是java8平臺支持的特性
private static final class BodyCallAdapter<R> implements CallAdapter<R, CompletableFuture<R>> {
private final Type responseType;
BodyCallAdapter(Type responseType) {
this.responseType = responseType;
}
@Override public Type responseType() {
return responseType;
}
@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;
}
}
ResponseCallAdapter:將原始Call轉爲CompletableFuture<Response>
private static final class ResponseCallAdapter<R>
implements CallAdapter<R, CompletableFuture<Response<R>>> {
private final Type responseType;
ResponseCallAdapter(Type responseType) {
this.responseType = responseType;
}
@Override public Type responseType() {
return responseType;
}
@Override public CompletableFuture<Response<R>> adapt(final Call<R> call) {
final CompletableFuture<Response<R>> future = new CompletableFuture<Response<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) {
future.complete(response);
}
@Override public void onFailure(Call<R> call, Throwable t) {
future.completeExceptionally(t);
}
});
return future;
}
}
適配第三方框架:RxJava2CallAdapterFactory的實現
public final class RxJava2CallAdapterFactory extends CallAdapter.Factory {
// 默認傳的調度器是爲空的
public static RxJava2CallAdapterFactory create() {
return new RxJava2CallAdapterFactory(null, false);
}
public static RxJava2CallAdapterFactory createAsync() {
return new RxJava2CallAdapterFactory(null, true);
}
public static RxJava2CallAdapterFactory createWithScheduler(Scheduler scheduler) {
if (scheduler == null) throw new NullPointerException("scheduler == null");
return new RxJava2CallAdapterFactory(scheduler, false);
}
// 調度器
private final @Nullable Scheduler scheduler;
// 是否異步
private final boolean isAsync;
// 構造器
private RxJava2CallAdapterFactory(@Nullable Scheduler scheduler, boolean isAsync) {
this.scheduler = scheduler;
this.isAsync = isAsync;
}
// 獲取Call適配器
@Override
public CallAdapter<?, ?> get(Type returnType, Annotation[] annotations, Retrofit retrofit) {
Class<?> rawType = getRawType(returnType);
// 如果返回類型爲 Completable,則適配爲Completable,爲Completable相當於Runable,執行任務不會發射數據
if (rawType == Completable.class) {
return new RxJava2CallAdapter(Void.class, scheduler, isAsync, false, true, false, false,
false, true);
}
boolean isFlowable = rawType == Flowable.class;
boolean isSingle = rawType == Single.class;
boolean isMaybe = rawType == Maybe.class;
// 如果不是Observable、Flowable,Single,Maybe,則適配爲null,因爲RxJava2只有這幾種被觀察者
if (rawType != Observable.class && !isFlowable && !isSingle && !isMaybe) {
return null;
}
boolean isResult = false;
boolean isBody = false;
Type responseType;
if (!(returnType instanceof ParameterizedType)) {
String name = isFlowable ? "Flowable"
: isSingle ? "Single"
: isMaybe ? "Maybe" : "Observable";
throw new IllegalStateException(name + " return type must be parameterized"
+ " as " + name + "<Foo> or " + name + "<? extends Foo>");
}
// 獲取觀察的數據類型
Type observableType = getParameterUpperBound(0, (ParameterizedType) returnType);
Class<?> rawObservableType = getRawType(observableType);
if (rawObservableType == Response.class) {
// 如果觀察的數據類型爲Response,則Response必須要有泛型參數,即observableType爲ParameterizedType。然後不是result,也不是body.比如Observable<Response<String>>
if (!(observableType instanceof ParameterizedType)) {
throw new IllegalStateException("Response must be parameterized"
+ " as Response<Foo> or Response<? extends Foo>");
}
// 獲取Response的泛型參數Type
responseType = getParameterUpperBound(0, (ParameterizedType) observableType);
} else if (rawObservableType == Result.class) {
// Result和Response同理,是result,比如Observable<Result<String>>
if (!(observableType instanceof ParameterizedType)) {
throw new IllegalStateException("Result must be parameterized"
+ " as Result<Foo> or Result<? extends Foo>");
}
responseType = getParameterUpperBound(0, (ParameterizedType) observableType);
isResult = true;
} else {
// 否則爲body,即使用者自定義類型,比如Observable<String>
responseType = observableType;
isBody = true;
}
// 然後傳給RxJava2CallAdapter構造器,構造出對應條件的Call適配器
return new RxJava2CallAdapter(responseType, scheduler, isAsync, isResult, isBody, isFlowable,
isSingle, isMaybe, false);
}
}
RxJava2CallAdapter.java
// 負責把Call<R>轉爲Rxjava的被觀察者<R>
final class RxJava2CallAdapter<R> implements CallAdapter<R, Object> {
// 響應類型
private final Type responseType;
// 調度器
private final @Nullable Scheduler scheduler;
// 是否異步
private final boolean isAsync;
// 是否原始結果
private final boolean isResult;
// 是否是body結果
private final boolean isBody;
// 是否背壓
private final boolean isFlowable;
// 是否Single
private final boolean isSingle;
// 是否Maybe
private final boolean isMaybe;
// 是否是Completable
private final boolean isCompletable;
RxJava2CallAdapter(Type responseType, @Nullable Scheduler scheduler, boolean isAsync,
boolean isResult, boolean isBody, boolean isFlowable, boolean isSingle, boolean isMaybe,
boolean isCompletable) {
this.responseType = responseType;
this.scheduler = scheduler;
this.isAsync = isAsync;
this.isResult = isResult;
this.isBody = isBody;
this.isFlowable = isFlowable;
this.isSingle = isSingle;
this.isMaybe = isMaybe;
this.isCompletable = isCompletable;
}
@Override public Type responseType() {
return responseType;
}
@Override public Object adapt(Call<R> call) {
// 不管怎樣,先轉爲Observable<Response<R>>
Observable<Response<R>> responseObservable = isAsync
? new CallEnqueueObservable<>(call)
: new CallExecuteObservable<>(call);
Observable<?> observable;
if (isResult) {
// 如果是Result類型,則轉爲ResultObservable
observable = new ResultObservable<>(responseObservable);
} else if (isBody) {
// 如果是用戶自定義的Body類型,則轉爲BodyObservable
observable = new BodyObservable<>(responseObservable);
} else {
// 其它則返回Observable<Response<R>>
observable = responseObservable;
}
if (scheduler != null) {
observable = observable.subscribeOn(scheduler);
}
// 如果要支持背壓,則把observable轉爲Flowable
if (isFlowable) {
return observable.toFlowable(BackpressureStrategy.LATEST);
}
// 如果要Single,則把observable轉爲Single
if (isSingle) {
return observable.singleOrError();
}
// 如果要Maybe,則把observable轉爲Maybe
if (isMaybe) {
return observable.singleElement();
}
// 如果要Completable,則把observable轉爲Completable
if (isCompletable) {
return observable.ignoreElements();
}
return observable;
}
}
2.2.5 callbackExecutor: Executor
回調執行器,即回調執行在哪個線程池提供的線程中:其實在Platform裏面Android平臺已經有一個MainThreadExecutor了,也可以自定義線程池,Retrofit在Androdi平臺回調默認在主線程回調,所有沒必要在切換線程
2.2.6 validateEagerly:boolean
是否提前驗證Service接口方法,默認爲false
3 Retrofit如何通過動態代理把一個接口轉爲具體的實現實例?
關鍵代碼:
public <T> T create(final Class<T> service) {
Utils.validateServiceInterface(service);
if (validateEagerly) {
eagerlyValidateMethods(service);
}
return (T) Proxy.newProxyInstance(service.getClassLoader(), new Class<?>[] { service },
new InvocationHandler() {
private final Platform platform = Platform.get();
@Override public Object invoke(Object proxy, Method method, @Nullable Object[] args)
throws Throwable {
// If the method is a method from Object then defer to normal invocation. 如果方法是object的,那麼就執行object對應的方法
if (method.getDeclaringClass() == Object.class) {
return method.invoke(this, args);
}
// 如果平臺支持默認方法實現,則調用默認方法實現,一般都不這樣做,也許是適配最新的java接口支持默認實現
if (platform.isDefaultMethod(method)) {
return platform.invokeDefaultMethod(method, service, proxy, args);
}
// 大多數情況下都是先從Method中提取出ServiceMethod,然後通過ServiceMethod調用HttpCall來實現請求
return loadServiceMethod(method).invoke(args != null ? args : emptyArgs);
}
});
}
首先是拿到用戶自定義的Service接口class,然後用java的Proxy.newProxyInstance
構造出一個動態代理,但是該代理並沒有持有常規意義上已存在的被代理者的引用,而只是取得一個代理執行權,當然也可以理解成是代理HTTP Call。它首先從method中提取出HttpServiceMethod,HttpServiceMethod相當於是HttpCall調用方法的適配器,從而實現動態代理在被調用方法時,最終就是在調用HttpCall,這個就是Retrofit的精髓之處,Retrofit結合註解然後代理OkHttp,使使用者在做請求時以簡潔的代碼快速構造請求代碼,比如你不必再寫很多Request.Builder代碼,不必再設計回調結果的轉換代碼等。