首先我們得先熟悉下 OkHttp 同步請求的流程 ===>可以看下上篇文章OkHttp同步請求
接下來我們直接從創(chuàng)建 OkHttpClient 中開始查看轰驳。
通過查看源碼我們知道了創(chuàng)建 OkHttpClient 對象弟灼,實際上是 OkHttpClient 中靜態(tài)類 Builder 的 Builder() 的構(gòu)造方法先初始化了一些參數(shù)和對象(這些參數(shù)對象會在后面的請求流程中會用到)田绑,
再通過調(diào)用 OkHttpClient 自己的 build()方法將初始化好了的 Builder 對象賦值給本身掩驱,從而創(chuàng)建出了一個客服端的OkHttpClient對象。
- 當(dāng)我們創(chuàng)建一個對象時,如果這個對象需要很多參數(shù)拼苍,這個時候我們也可以用到Builder這種創(chuàng)建模式调缨。
用 Builder 對象來封裝我們初始化對象所需要的參數(shù),然后傳遞這個Builder對象到初始化對象構(gòu)造方法里妇多,完成整個初始化對象屬性的初始化瘫析。
然后從創(chuàng)建 Request 中開始查看贬循。
查看源碼我們知道了創(chuàng)建 Request 對象,實際上也是 Request 中靜態(tài)類 Builder 的 Builder() 的構(gòu)造方法先初始化了一些參數(shù)烂瘫,默認(rèn)了請求方式為 get
再通過調(diào)用 Request 自己的 build()方法將初始化好了的 Builder 對象賦值給本身坟比,從而創(chuàng)建出了一個客服端的Request對象葛账。
- 可以發(fā)現(xiàn) OkHttpClient 和 Request 都是用的Builder這種創(chuàng)建模式
創(chuàng)建 Call 對象
實際上是通過創(chuàng)建好了的 OkHttpClient 對象調(diào)用 newCall(Request request) 方法來封裝創(chuàng)建好的 Request 對象籍琳,從而得到Call對象趋急。
//第三步創(chuàng)建 Call對象
Call call=client.newCall(request);
Call 通過查看源碼發(fā)現(xiàn) Call 只是一個接口势誊,再從 newCall() 去查看源碼粟耻,由于 Call 是一個接口,所以 Call 的實際操作都是在 Call 的實現(xiàn)類 RealCall 中所做的霜威。
RealCall 到底又做了什么呢侥祭?我們可以點進(jìn) RealCall 的構(gòu)造方法源碼去看看
- OkHttp中不管是同步請求還是異步請求矮冬,都是通過 OkHttpClient 對象調(diào)用 newCall(Request request) 方法來進(jìn)行創(chuàng)建的胎署,然后再通過創(chuàng)建好的 Call 對象來進(jìn)行相應(yīng)的操作琼牧。
接下來就走到了第四步 Call.execute()完成同步請求
//第四步 通過call 對象調(diào)用同步異步的調(diào)用
Response response = call.execute();
接下來我們還是到 execute() 方法去查看源碼。由于Call是個接口撬槽,所以還是得到 Call的實現(xiàn)類 RealCall 中進(jìn)行查看趾撵。
在源碼中我們看到了同步請求的重要的一個環(huán)節(jié)代碼
try {
client.dispatcher().executed(this);
Response result = getResponseWithInterceptorChain();
if (result == null) throw new IOException("Canceled");
return result;
} catch (IOException e) {
eventListener.callFailed(this, e);
throw e;
} finally {
client.dispatcher().finished(this);
}
我們先通過源碼知道
是得到 OkHttpClient 中初始化好的的 dispatcher 分發(fā)器對象
然后我們再到
我們可以通過同步請求隊列 runninSyncCalls 點擊上去發(fā)現(xiàn)有多種請求隊列
接下來就是返回響應(yīng)信息
由于同步異步這一塊是一樣的,所以下一章節(jié)異步詳細(xì)說明言津。
我們最后來看源碼中最后的一句代碼
我們可以點擊進(jìn)去看下它怎么實現(xiàn)的
- 我們可以發(fā)現(xiàn)在同步請求中 Dispatcher 做的事就很少纺念,就是添加同步請求,移除同步請求烙博。然而在異步請求中 Dispatcher 做的事就很多了渣窜。
至此我們的OkHttp的同步請求源碼分析已經(jīng)完成了