OkHttp 原始碼分析(一)

2021-09-26 18:54:59 字數 3813 閱讀 4557

首先我們來看一段**:

});我們直接來看這一段

研究okhttpclient這個類之前,我們先來看看他都實現了那些類。

}

這裡我們就很明白newcall 的來歷了。廢話不多說直接看okhttpclient的newcall方法。
public class okhttpclient implements cloneable, call.factory, websocket.factory 

}

然後進入realcall:

static realcall newrealcall(okhttpclient client, request originalrequest, boolean forwebsocket)
private realcall(okhttpclient client, request originalrequest, boolean forwebsocket)
這裡我們看到比較重要的乙個類retryandfollowupinterceptor。重試/重定向 ***。這裡我們不多做解析,後面的章節我們會詳細的分析。

接下來就是

call.enqueue(new callback()

@override

public void onresponse(call call, response response) throws ioexception

});

從上面的分析我們知道,這裡的call 是realcall,so...我們去看一下他的enqueue方法。(當然這裡我們也看見了realcall也是實現的call介面)。

@override public void enqueue(callback responsecallback) 

...client.dispatcher().enqueue(new asynccall(responsecallback));

}

乙個同步鎖是否執行過的判斷。然後我們來看一下這段**:
client.dispatcher().enqueue(new asynccall(responsecallback));

這樣,我們需求進入到okhttpclient中,

}接著,我們來看看dispatcher。

public final class dispatcher 

... public synchronized executorservice executorservice()

return executorservice;

} synchronized void enqueue(asynccall call) else

} private void promotecalls()

if (runningasynccalls.size() >= maxrequests) return; // reached max capacity.

}} synchronized void executed(realcall call)

private void finished(dequecalls, t call, boolean promotecalls)

if (runningcallscount == 0 && idlecallback != null)

}}

好吧有點多,我們來看看都是啥,首先dispatcher是乙個排程器maxrequests最大請求為64,maxrequestsperhost每個主機最多請求數為5。

public synchronized executorservice executorservice() 

return executorservice;

}

生成了乙個可以無限大的 存活週期60s的執行緒池。

private final dequereadyasynccalls = new arraydeque<>();

private final dequerunningasynccalls = new arraydeque<>();

private final dequerunningsynccalls = new arraydeque<>();

三個佇列,乙個同步請求的佇列runningsynccalls,兩個非同步請求使用的佇列(readyasynccalls為等待請求的佇列,runningasynccalls為正在請求的佇列)。

好了繼續enqueue方法,很明顯,我們要先看一下asynccall。
final class asynccall extends namedrunnable 

... @override protected void execute() else

} catch (ioexception e) else

} finally

}}

這是乙個可以命名的執行緒。最重要的方法execute。因為設計到okhttpclient的攔截機制,我們後面會詳細分析。

現在我們終於來到了

client.dispatcher().enqueue(new asynccall(responsecallback));
我們進入到dispatcher可知:

synchronized void enqueue(asynccall call)  else 

}

如果runningasynccalls大小小於64,這個介面主機請求小於5 ,這時就會把call 新增到正在請求的佇列中,並且通過executorservice的排程執行asynccall的execute方法,最終通過    response response = getresponsewithinterceptorchain(); 獲取到response通過callback返回。

OkHttp 原始碼分析

先來看 new okhttpclient 然後 clien.newcall request 建立了 realcall 物件,這也是 okhttp 中乙個重要的類,先來分析非同步執行的原始碼吧,因為同步執行跟非同步的後半段沒什麼區別了。override public void enqueue call...

OkHttp原始碼分析(四)DiskLruCache

前一章講到okhttp使用的快取是disklrucache,displrucache是以linkedhashmap為底層實現的磁碟快取,但是具體是如何快取的我還是不是很理解,作為程式設計師,不理解和鹹魚有什麼分別。為了不做鹹魚,我們還是看一下原始碼吧!public final class diskl...

OkHttp原始碼解析 一

執行請求的地方.client.newcall request enqueue new callback override public void onresponse call call,response response throws ioexception okhttpclient的newcal...