okhttp源碼解析

1.okhttp源碼解析

  流程詳解(依賴implementation 'com.squareup.okhttp3:okhttp:3.10.0')

  1.創建OkhttpClient對象(用於發送http請求和讀取請求返回的數據,創建方式有兩種:構建這模式和普通創建

  ,構建這模式可以自定義Builder,普通創建使用默認的Builder).

  2.創建Call對象:一個call對象表示一次請求,每次交易請求都會產生一個新的Call對象,Call其實是一個接口,

    它的實現類是RealCall對象。創建過程:通過newCall()方法返回一個RealCall對象。

  3.請求交易:okhttp提供了兩種請求方式:同步請求和異步請求,同步請求調用call.execute()方法,異步請

    求調用call.enqueue(Callback callback)方法。

    再看兩個請求方式之前需要先知道okhttp中的一個重要成員Dispatcher(調度器)。

    3.1.Dispatcher(調度器):Okhttp的任務調度核心類,負責管理同步和異步請求,並且在其內部還維護了一個

      線程池用於執行相應的請求,同時在其內部還維護了兩個任務隊列:準備執行的任務隊列和正在執行的任務

      隊列。

    3.2.同步請求call.execute()

       同步請求調用call.execute()方法,在其內部會調用Dispatcher的execute()方法和getResponseWithInterceptor

       Chain(),通過該方法把realcall對象添加到任務隊列中(runningSyncCalls.add(call)),然後不管結果如何最後

       會調用Dispatcher的finished方法把該請求從任務隊列中移除。

    3.3.異步請求call.enqueue(Callback callback)

        異步請求調用call.enqueue(Callback callback),在其內部會調用dispatcher的equeue(new AsyncCall(respon

        seCallback))方法,該方法會傳入一個AsyncCall對象,在dispatcher的enqueue方法內會先判斷當前運行中的

        請求數是否小於最大請求數默認最大請求數爲64,並同時判斷當前運行中的共同主機請求數是否小於設定的

        最大請求數,默認同一主機的請求數量最大值爲5,當兩者同時成立時,會調用runningAsyncCalls.add(call)

        方法(表示此次請求的call對象存在runningAsyncCalls隊列中)和executorService()的execute(call)方法,反

        之就會調用redyAsncCalls.add(call)(表示此次請求的call對象存在readyAsyncCalls隊列中,readyAsyncCalls

        表示已準備好並等待執行請求的隊列,當有空閒網絡請求線程時,會從該隊列中取出並執行網絡請求),通

        過executorService.execute(call)方法將call對象傳入線程池執行,通過源碼可知AsyncCall是一個Runnable的

        實現,用來開啓一個線程,executorService是dispatcher內部維護的線程池,所以executorService.execute

        (call)方法的作用是通過網絡請求線程池執行該線程的run()方法調用AsyncCall的execute()方法,最後在exe

        cute()方法內調用和同步請求時提到的getResponseWithInterceptorChain()方法。

    3.4.getResponseWithInterceptorChain()/攔截器

         這個方法是通過攔截器鏈對請求數據和返回數據進行處理,內部採用責任鏈模式,將每一個攔截器對應負

         責的處理任務進行嚴格分配,最後將交易結果返回並回調到暴露給調用者的接口上。

        根據源碼可以看到,最後交給了了RealInterceptorChain(攔截器鏈類)這個真正的處理類,並調用

        RealInterceptorChain的proceed()方法,在該方法內部會調用攔截器的intercept(next)方法,只有當前攔截器

        的response返回結果時,纔會執行下一個攔截器(因此得出結論:下一個攔截器依賴於當前攔截器的返回,

       可以保證攔截器的依次執行。),在攔截器鏈中執行的結果,在同步請求中會直接在response返回,異步請

       求時會把攔截器鏈的處理結果通過Callback的onReponse回調給用戶。

         這些攔截器包括:

        ①.用戶自定義的攔截器

        ②.retryAndFollowUpInterceptor:重試和重定向攔截器,主要負責網絡失敗重連。

        ③.BridgeInterceptor:主要負責添加交易請求頭。

        ④.CacheInterceptor:緩存攔截器,主要負責攔截緩存。

        ⑤.ConnectInterceptor:網絡連接攔截器,主要負責正式開啓http請求。

        ⑥.CallServerInterceptor:負責發送網絡請求和讀取網絡響應

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章