Retrofit源碼解讀(二)--Retrofit中網(wǎng)絡(luò)通信相關(guān)
標(biāo)簽(空格分隔): Retrofit源碼 學(xué)習(xí)筆記
網(wǎng)絡(luò)通信八步走
1巡李、創(chuàng)建Retrofit實(shí)例
2媳荒、定義一個(gè)網(wǎng)絡(luò)請(qǐng)求接口并對(duì)接口中的方法添加注解
3、通過(guò) 動(dòng)態(tài)代理 生成網(wǎng)絡(luò)請(qǐng)求對(duì)象
4膛腐、通過(guò)網(wǎng)絡(luò)請(qǐng)求適配器,將網(wǎng)絡(luò)請(qǐng)求對(duì)象進(jìn)行平臺(tái)適配
5铡俐、通過(guò)網(wǎng)絡(luò)請(qǐng)求執(zhí)行器,發(fā)送網(wǎng)絡(luò)請(qǐng)求
6结蟋、通過(guò)數(shù)據(jù)轉(zhuǎn)換器,解析服務(wù)器返回的數(shù)據(jù)
7、通過(guò)回調(diào)執(zhí)行器,切換線程
8探孝、用戶(hù)在主線程編寫(xiě)邏輯
創(chuàng)建Retrofit實(shí)例
public static Retrofit getRetrofit() {
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.connectTimeout(10, TimeUnit.SECONDS);
return new Retrofit.Builder()
.client(builder.build())
.baseUrl("http://m2.qiushibaike.com/") //設(shè)置請(qǐng)求網(wǎng)絡(luò)地址的url(基地址 這個(gè)地址一定要"/"結(jié)尾 要不會(huì)出現(xiàn)問(wèn)題)
.addConverterFactory(GsonConverterFactory.create()) //設(shè)置數(shù)據(jù)解析器 默認(rèn)使用的Gson
.addCallAdapterFactory(RxJavaCallAdapterFactory.create()) //設(shè)置支持RxJava轉(zhuǎn)換器
.build();
}
Retrofit的成員變量
//map對(duì)象,key值是Method 請(qǐng)求方法,value值是ServiceMethod 主要代表我們的網(wǎng)絡(luò)請(qǐng)求方法進(jìn)行注解之后的解析使用
//serviceMethodCache 用于緩存網(wǎng)絡(luò)請(qǐng)求配置,方法,數(shù)據(jù)轉(zhuǎn)換器 適配器
private final Map<Method, ServiceMethod<?, ?>> serviceMethodCache = new ConcurrentHashMap<>();
//請(qǐng)求網(wǎng)絡(luò)的okhttp工廠 默認(rèn)的就是這個(gè)
final okhttp3.Call.Factory callFactory;
//請(qǐng)求基地址
final HttpUrl baseUrl;
//數(shù)據(jù)轉(zhuǎn)換器工廠集合 用于數(shù)據(jù)請(qǐng)求得到的response進(jìn)行轉(zhuǎn)換
final List<Converter.Factory> converterFactories;
//網(wǎng)絡(luò)請(qǐng)求適配器工廠集合 比如RxJava的call
final List<CallAdapter.Factory> adapterFactories;
//回調(diào)執(zhí)行器 默認(rèn)的是MainThreadExecutor
final @Nullable Executor callbackExecutor;
//標(biāo)志位 是否需要立即解析接口中的方法 后面解析的時(shí)候會(huì)看到
final boolean validateEagerly;
Builder內(nèi)部類(lèi)
內(nèi)部類(lèi)中的成員變量
//平臺(tái) ios android java8
private final Platform platform;
//請(qǐng)求網(wǎng)絡(luò)的okhttp工廠 默認(rèn)的就是這個(gè)
private @Nullable okhttp3.Call.Factory callFactory;
//請(qǐng)求基地址 需要轉(zhuǎn)換的
private HttpUrl baseUrl;
//數(shù)據(jù)轉(zhuǎn)換器工廠集合 用于數(shù)據(jù)請(qǐng)求得到的response進(jìn)行轉(zhuǎn)換
private final List<Converter.Factory> converterFactories = new ArrayList<>();
//網(wǎng)絡(luò)請(qǐng)求適配器工廠集合 比如RxJava的call
private final List<CallAdapter.Factory> adapterFactories = new ArrayList<>();
//回調(diào)執(zhí)行器 默認(rèn)的是MainThreadExecutor
private @Nullable Executor callbackExecutor;
//標(biāo)志位 是否需要立即解析接口中的方法 后面解析的時(shí)候會(huì)看到
private boolean validateEagerly;
可以看到這個(gè)內(nèi)部類(lèi)的成員變量和retrofit的成員變量是一樣的,因?yàn)檫@個(gè)是建造者模式,對(duì)于一些的添加的變量和外部類(lèi)是一樣的笋婿。構(gòu)建者模式就是通過(guò)這些配置,將一些成員變量進(jìn)行初始化
Builder無(wú)參數(shù)構(gòu)造方法
public Builder() {
this(Platform.get());
}
可以看出Platform 這個(gè)類(lèi)是個(gè)單例 通過(guò)findPlatform()方法獲取到這個(gè)單例
其中的get()方法就是findPlatform()的方法
在這個(gè)方法里面,通過(guò)反射來(lái)獲取類(lèi)名,在安卓中就是返回new Android()
//也就是下方的這個(gè)Android類(lèi)
static class Android extends Platform {
//會(huì)有一個(gè)默認(rèn)的回調(diào)執(zhí)行器MainThreadExecutor Looper.getMainLooper() 也就是主線程
@Override public Executor defaultCallbackExecutor() {
return new MainThreadExecutor();
}
//創(chuàng)建默認(rèn)的網(wǎng)絡(luò)請(qǐng)求適配器工廠 創(chuàng)建默認(rèn)的網(wǎng)絡(luò)請(qǐng)求適配器回調(diào)
//這個(gè)默認(rèn)請(qǐng)求工廠產(chǎn)生的calladapter讓我們的call請(qǐng)求在異步調(diào)用的時(shí)候會(huì)指定我們的Executor執(zhí)行器 讓他執(zhí)行回調(diào)
@Override CallAdapter.Factory defaultCallAdapterFactory(@Nullable Executor callbackExecutor) {
if (callbackExecutor == null) throw new AssertionError();
return new ExecutorCallAdapterFactory(callbackExecutor);
}
static class MainThreadExecutor implements Executor {
private final Handler handler = new Handler(Looper.getMainLooper());
@Override public void execute(Runnable r) {
handler.post(r);
}
}
}
Builder有參數(shù)構(gòu)造方法
Builder(Platform platform) {
//做好Platform的初始化
this.platform = platform;
// Add the built-in converter factory first. This prevents overriding its behavior but also
// ensures correct behavior when using converters that consume all types.
//在數(shù)據(jù)轉(zhuǎn)換工廠集合中添加一個(gè)內(nèi)置的BuiltInConverters對(duì)象 也就是說(shuō)如果當(dāng)我們沒(méi)有添加或者沒(méi)有指定數(shù)據(jù)轉(zhuǎn)換工廠(一般會(huì)指定為GsonConverterFactory為我們的數(shù)據(jù)轉(zhuǎn)換工廠)
converterFactories.add(new BuiltInConverters());
}
由此我們可以看出來(lái),Builder這個(gè)內(nèi)部類(lèi)主要是構(gòu)建了我們的使用平臺(tái),配置了數(shù)據(jù)轉(zhuǎn)換器工廠(默認(rèn)),網(wǎng)絡(luò)適配器的工廠,以及我們的Ececutor(默認(rèn)值的初始化),這個(gè)地方還沒(méi)有真正的配置到retrofit的成員變量中。
baseUrl(string) 方法
public Builder baseUrl(String baseUrl) {
//工具類(lèi)檢測(cè)我們傳入的url是否為空
checkNotNull(baseUrl, "baseUrl == null");
//通過(guò)parse方法將String類(lèi)型的Url轉(zhuǎn)換為HttpUrl類(lèi)型的成員變量
HttpUrl httpUrl = HttpUrl.parse(baseUrl);
if (httpUrl == null) {
throw new IllegalArgumentException("Illegal URL: " + baseUrl);
}
//最后通過(guò)baseUrl()這個(gè)方法來(lái)返回Builder這個(gè)類(lèi)型
return baseUrl(httpUrl);
}
//
public Builder baseUrl(HttpUrl baseUrl) {
//判空處理
checkNotNull(baseUrl, "baseUrl == null");
//拆分成多個(gè)片段
List<String> pathSegments = baseUrl.pathSegments();
//判斷集合中的最后一個(gè)是否以“/”結(jié)尾
if (!"".equals(pathSegments.get(pathSegments.size() - 1))) {
//在這里可以看出來(lái)傳入的url必須以 “/” 結(jié)尾
throw new IllegalArgumentException("baseUrl must end in /: " + baseUrl);
}
this.baseUrl = baseUrl;
return this;
}
addConverterFactory()方法
/** Add converter factory for serialization and deserialization of objects. */
public Builder addConverterFactory(Converter.Factory factory) {
converterFactories.add(checkNotNull(factory, "factory == null"));
return this;
}
我們來(lái)看下我們傳入的Factory這個(gè)對(duì)象GsonConverterFactory
因?yàn)槲覀兪峭ㄟ^(guò)GsonConverterFactory.create()方法傳入的
public static GsonConverterFactory create() {
//創(chuàng)建Gson對(duì)象
return create(new Gson());
}
public static GsonConverterFactory create(Gson gson) {
return new GsonConverterFactory(gson);
}
private GsonConverterFactory(Gson gson) {
if (gson == null) throw new NullPointerException("gson == null");
//將傳入的gson對(duì)象賦值給我們GsonConverterFactory里面創(chuàng)建的gson成員變量
this.gson = gson;
}
addCallAdapterFactory()方法
/**
* Add a call adapter factory for supporting service method return types other than {@link
* Call}.
*/
public Builder addCallAdapterFactory(CallAdapter.Factory factory) {
adapterFactories.add(checkNotNull(factory, "factory == null"));
return this;
}
我們來(lái)看下RxJavaCallAdapterFactory.create()
public static RxJavaCallAdapterFactory createWithScheduler(Scheduler scheduler) {
if (scheduler == null) throw new NullPointerException("scheduler == null");
return new RxJavaCallAdapterFactory(scheduler, false);
}
private RxJavaCallAdapterFactory(Scheduler scheduler, boolean isAsync) {
//主要的是這個(gè)Scheduler 用于RxJava中的調(diào)度器
this.scheduler = scheduler;
this.isAsync = isAsync;
}
由此我們可以看出來(lái)addConverterFactory()和addCallAdapterFactory()方法很類(lèi)似,就是創(chuàng)建默認(rèn)的(我們想要使用的數(shù)據(jù)轉(zhuǎn)換器和網(wǎng)絡(luò)適配器),并對(duì) converterFactories 顿颅、adapterFactories這兩個(gè)進(jìn)行添加數(shù)據(jù)
build()方法
public Retrofit build() {
//首先判斷baseUrl 這個(gè)不能為空
if (baseUrl == null) {
throw new IllegalStateException("Base URL required.");
}
//這個(gè)網(wǎng)絡(luò)請(qǐng)求執(zhí)行器 用于產(chǎn)生call 代表實(shí)際的http請(qǐng)求
okhttp3.Call.Factory callFactory = this.callFactory;
//如果為空 就會(huì)創(chuàng)建一個(gè)OkHttpClient 這里也就是說(shuō)retrofit默認(rèn)就是Okhttp作為底層網(wǎng)絡(luò)請(qǐng)求
if (callFactory == null) {
callFactory = new OkHttpClient();
}
//初始化回調(diào)方法的執(zhí)行器 用在retrofit異步請(qǐng)求的時(shí)候(同步請(qǐng)求是不需要的) 子線程耗時(shí)操作-->UI線程更新UI
Executor callbackExecutor = this.callbackExecutor;
//如果為空的是 就會(huì)創(chuàng)建一個(gè)默認(rèn)的回調(diào)執(zhí)行器 這個(gè)默認(rèn)的是在platform里面的默認(rèn)創(chuàng)建方法 也就是主線程的那個(gè)
if (callbackExecutor == null) {
callbackExecutor = platform.defaultCallbackExecutor();
}
// Make a defensive copy of the adapters and add the default Call adapter.
//網(wǎng)絡(luò)請(qǐng)求適配器集合 將成員變量當(dāng)中的網(wǎng)絡(luò)請(qǐng)求適配器工廠作為參數(shù)傳到arraylist的構(gòu)造函數(shù)當(dāng)中 主要用于配置網(wǎng)絡(luò)請(qǐng)求適配器的工廠
List<CallAdapter.Factory> adapterFactories = new ArrayList<>(this.adapterFactories);
//創(chuàng)建好網(wǎng)絡(luò)請(qǐng)求適配器工廠之后 添加我們這個(gè)安卓平臺(tái)的默認(rèn)的網(wǎng)絡(luò)請(qǐng)求適配器
adapterFactories.add(platform.defaultCallAdapterFactory(callbackExecutor));
// Make a defensive copy of the converters.
//
List<Converter.Factory> converterFactories = new ArrayList<>(this.converterFactories);
//這個(gè)時(shí)候傳入到Retrofit的構(gòu)造方法中 創(chuàng)建Retrofit對(duì)象
return new Retrofit(callFactory, baseUrl, converterFactories, adapterFactories,
callbackExecutor, validateEagerly);
}
這個(gè)時(shí)候我們簡(jiǎn)單的過(guò)了創(chuàng)建Retrofit實(shí)例的過(guò)程,可以通過(guò)建造者模式來(lái)對(duì)相應(yīng)的數(shù)值進(jìn)行初始化,配置相關(guān)的數(shù)據(jù)轉(zhuǎn)換器和適配器,最后通過(guò)build方法完成創(chuàng)建Retrofit的實(shí)例缸濒。