Okhttp同步请求源码分析
進階android,OKhttp源碼分析——同步請求的源碼分析
OKhttp是我們經常用到的框架,作為開發者們,我們不單單要學會靈活使用,還要知道他的源碼是如何設計的。
今天我們來分析一下OKhttp 同步請求的執行流程和源碼分析
so,老樣子,我們先來一張圖
從上圖可以看出,不管是同步請求還是異步請求,我們都需要創建一個OKhttpClient對象,用到的是build構造者模式,創建Request對象,然后再OKhttpClient的newCall方法和Request來封裝我們的call對象。創建我們的實際請求的call對象,從上圖可以看到,對于同步請求,我們調用的是excute方法,異步請求調用的是equeue方法。
我們看一下做簡單使用
OkHttpClient okHttpClient = new OkHttpClient.Builder().readTimeout(10, TimeUnit.SECONDS).build();Request request = new Request.Builder().url("https://blog.csdn.net/androidstarjack").build();Call call = okHttpClient.newCall(request);try {call.execute();//同步請求call.enqueue(new Callback() {//異步請求@Overridepublic void onFailure(Call call, IOException e) {}@Overridepublic void onResponse(Call call, Response response) throws IOException {}});} catch (IOException e) {e.printStackTrace();}復制代碼我們先看一下okhttp的build
首先我們通過源碼可以看出,okhttp的創建時通過build方法來創建的,其中初始化了一些事情,比如創建一個dispatcher攔截器,和一個連接池,連接池只要是鏈接狀態的保存以及復用。build是要是創建 okhttp是所需要的參數。
在創建Request創建的時候也是用構造者模式進行創建的,源碼如下:
Builder(Request request) {this.url = request.url;this.method = request.method;this.body = request.body;this.tag = request.tag;this.headers = request.headers.newBuilder();} 復制代碼request的build構造里面初始化了一些請求的URL,請求方法哈請求頭等請求報文的一些信息。
Call對象 是通過他的父親RealCall來完成的。
Call對象持有了Okhttp 和Request兩個對象,同時呢還創建了一個緩存攔截器RetryAndFollowUpInterceptor,用于所需要的重定向操作。
通過調用okhttpClient的newCAll來完成CALL的新建,進行相應的操作
緊接著調用execute方法來完成同步請求!
@Override public Response execute() throws IOException {synchronized (this) {if (executed) throw new IllegalStateException("Already Executed");executed = true;}captureCallStackTrace();eventListener.callStart(this);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);}}復制代碼//布爾值executed表示一個okhttp請求只能運行執行一次,然后開啟捕捉一些錯誤堆棧信息,點用一個eventListener監聽方法, 接卸來是調用分發器的executed方法。這才是重中之重。
...client.dispatcher().executed(this); ...復制代碼client.dispatcher返回一個分發器。然后通過分發器來執行操作:
在同步請求中,調用executed方法,很簡單酒吧這個Call對象添加到隊列當中。
Dispatcher的作用主要是維持call請求發給他 的狀態,同時維護了一個線程池,開啟了網絡請求。
從源碼中我們可以看到Dispatcher
這幾個請求隊列代表著不同狀態下的請求情況。
緊接著通過攔截器鏈依次調用執行操作。 最后還調用了Finish方法
注意第三個參數,為false,這個方法的主要作用就是移除當前的請求,如果不能移除的話,返回異常,我們可以注意到,同步請求不需要調用promoteCalls,只有在異步請求的時候才會調用到,這個方法以后我們在講。
最后判斷,正在將要執行的請求隊列集合為0并且閑調用的回調不為null時,調用其run方法。此時,同步方法執行完成。
2018年技術文章匯總
NDK項目實戰—高仿360手機助手之卸載監聽
(Android)面試題級答案(精選版)
如果對技術開發比較感興趣,歡迎關注公眾號:終端研發部。一起交流技術,進階!
總結
以上是生活随笔為你收集整理的Okhttp同步请求源码分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JavaScript基础总结(五)——M
- 下一篇: “小罐茶大师作”20亿元销售额难掩虚假宣