Http庫一定是兩個核心,一個是IO核心,一個是http協議的封裝,okhttp基於okio庫封裝了http協議並整合了分發器和線程池模型,是一個用起來很簡單,api介面很容易理解的高效庫。
首先看一段最簡單的也是最常用的甚至是你可能僅僅只會用到這個的一段代碼:
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url(“http://taobao.com”).build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onResponse(Call call, Response response) throws IOException {
if (response.isSuccessful()) {
// do something
}
}
@Override
public void onFailure(Call call, IOException e) {
// do something
}
});
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
步奏:
1. 創建一個okhttpclient
2. 創建一個request
3. 通過okhttpclient把request封裝成一個call
4. 把call丟進非同步執行隊列,並丟進去一個callback回調方法
5. 等著執行結束或者出錯,在回調里做一些事情
整個流程很清晰,很容易理解,但我們還是想知道下面是怎麼實現的,好奇心作祟,ok,我們來看看這個代碼中的關鍵部分call.enqueue的調用鏈:
call是介面,實現類是realcall,realcall裡面有okhttpclient的實例,而okhttpclient裡面有dispacher的實例,所以實際上realcall會把callback放進dispatcher里,而dispatcher里會線程池和任務隊列,線程會從任務隊列里取任務執行,執行是通過interceptChain的里所有攔截器去遍歷執行的,最後返回response
ok說了這麼多可能還是有點懵,繼續上圖:
- dispatcher是一個分發器,裡面的任務隊列存著很多任務call,每次取出一個call去執行
- interceptorChain是一個攔截器鏈條,可以想像成一個鏈表,
- interceptor是攔截器,每個攔截器都會對獲取的流做一些處理,例如重試攔截器,緩存攔截器等等
- 每個攔截器處理完後會把response傳遞給攔截器鏈的下一個攔截器,直到這個鏈表跑完最後返給chain,然後返給callback的回調方法,這個設計和netty一樣,但其實現真心沒有netty寫的漂亮
至於IO核心被放到client里了,下次再分解。
TAG:程序員小新人學習 |