okhttp源碼閱讀

對okhttp的源碼進行了閱讀,主要是學(xué)習(xí)大神的寫作思路吠冤。
官網(wǎng)上面的okhttp的例子浑彰,我們通過例子下手,來看源碼拯辙。

OkHttpClient client = new OkHttpClient();
String run(String url) throws IOException {
  Request request = new Request.Builder()
      .url(url)
      .build();
  Response response = client.newCall(request).execute();
  return response.body().string();
}

一郭变、 沒別的,首頁就是OkHttpClient這個類涯保,這個類里面東西很多诉濒,作者用了建造者模式(Builder Pattern)。當(dāng)然在例子里面看不出來夕春,但是未荒,作者在類的注釋里面給了范例。

 // The singleton HTTP client.
public final OkHttpClient client = new OkHttpClient.Builder()
      .addInterceptor(new HttpLoggingInterceptor())
      .cache(new Cache(cacheDir, cacheSize))
      .build();

二及志、Request同樣也是使用了建造者模式片排,這里面主要就請求的url,參數(shù)速侈,請求頭率寡,請求體的設(shè)置。

 final HttpUrl url;
 final String method;
 final Headers headers;
 final RequestBody body;
 final Object tag;

三倚搬、 Response response = client.newCall(request).execute();
對于網(wǎng)絡(luò)請求冶共,出現(xiàn)在Call這個接口里面,而RealCall是具體的實現(xiàn)類每界,所以我們重點看RealCall這個類捅僵。
官方給的實例里面,調(diào)用了execute的方法眨层,這個是同步請求庙楚,還有異步的請求enqueue方法。

  1. 同步的請求趴樱,直接返回了Response
@Override public Response execute() throws IOException {
    synchronized (this) {
      if (executed) throw new IllegalStateException("Already Executed");
      executed = true;
    }
    captureCallStackTrace();
    try {
      client.dispatcher().executed(this);
      Response result = getResponseWithInterceptorChain();
      if (result == null) throw new IOException("Canceled");
      return result;
    } finally {
      client.dispatcher().finished(this);
    }
  }

2.異步請求需要AsyncCall回調(diào)

@Override public void enqueue(Callback responseCallback) {
    synchronized (this) {
      if (executed) throw new IllegalStateException("Already Executed");
      executed = true;
    }
    captureCallStackTrace();
    client.dispatcher().enqueue(new AsyncCall(responseCallback));
  }

在AsyncCall里面調(diào)用execute方法

@Override protected void execute() {
      boolean signalledCallback = false;
      try {
        Response response = getResponseWithInterceptorChain();
        if (retryAndFollowUpInterceptor.isCanceled()) {
          signalledCallback = true;
          responseCallback.onFailure(RealCall.this, new IOException("Canceled"));
        } else {
          signalledCallback = true;
          responseCallback.onResponse(RealCall.this, response);
        }
      } catch (IOException e) {
        if (signalledCallback) {
          // Do not signal the callback twice!
          Platform.get().log(INFO, "Callback failure for " + toLoggableString(), e);
        } else {
          responseCallback.onFailure(RealCall.this, e);
        }
      } finally {
        client.dispatcher().finished(this);
      }
    }
  }
  1. 不管是同步還是異步馒闷,都會出現(xiàn)getResponseWithInterceptorChain()這個方法。這個okhttp的核心業(yè)務(wù)伊佃。
Response getResponseWithInterceptorChain() throws IOException {
    // Build a full stack of interceptors.
    List<Interceptor> interceptors = new ArrayList<>();
    interceptors.addAll(client.interceptors());
    //重定向攔截器
    interceptors.add(retryAndFollowUpInterceptor);
    //對request進行重新封裝以及對返回的response進行處理到用戶可以使用
    interceptors.add(new BridgeInterceptor(client.cookieJar()));
    //緩存攔截器
    interceptors.add(new CacheInterceptor(client.internalCache()));
    //socket建立連接
    interceptors.add(new ConnectInterceptor(client));
    if (!forWebSocket) {
      interceptors.addAll(client.networkInterceptors());
    }
  
    //數(shù)據(jù)流進行讀寫
    interceptors.add(new CallServerInterceptor(forWebSocket));

    Interceptor.Chain chain = new RealInterceptorChain(
        interceptors, null, null, null, 0, originalRequest);
    return chain.proceed(originalRequest);
  }

這個是一個攔截器列表窜司, 每個攔截器有自己的作用,調(diào)用chain.proceed(originalRequest)方法航揉,這里面使用了遞歸

 // Call the next interceptor in the chain.
    RealInterceptorChain next = new RealInterceptorChain(
        interceptors, streamAllocation, httpCodec, connection, index + 1, request);
    Interceptor interceptor = interceptors.get(index);
    Response response = interceptor.intercept(next);

在每個攔截器里面的intercept方法里面調(diào)用chain.proceed(originalRequest)塞祈。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市帅涂,隨后出現(xiàn)的幾起案子议薪,更是在濱河造成了極大的恐慌尤蛮,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件斯议,死亡現(xiàn)場離奇詭異产捞,居然都是意外死亡,警方通過查閱死者的電腦和手機哼御,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門坯临,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人恋昼,你說我怎么就攤上這事看靠。” “怎么了液肌?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵挟炬,是天一觀的道長。 經(jīng)常有香客問我嗦哆,道長谤祖,這世上最難降的妖魔是什么卵沉? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任垮媒,我火速辦了婚禮衩婚,結(jié)果婚禮上枷莉,老公的妹妹穿的比我還像新娘。我一直安慰自己但壮,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著约郁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪但两。 梳的紋絲不亂的頭發(fā)上鬓梅,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天,我揣著相機與錄音谨湘,去河邊找鬼绽快。 笑死,一個胖子當(dāng)著我的面吹牛紧阔,可吹牛的內(nèi)容都是我干的坊罢。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼擅耽,長吁一口氣:“原來是場噩夢啊……” “哼活孩!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起乖仇,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤憾儒,失蹤者是張志新(化名)和其女友劉穎询兴,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體起趾,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡诗舰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了训裆。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片眶根。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖边琉,靈堂內(nèi)的尸體忽然破棺而出汛闸,到底是詐尸還是另有隱情,我是刑警寧澤艺骂,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布诸老,位于F島的核電站,受9級特大地震影響钳恕,放射性物質(zhì)發(fā)生泄漏别伏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一忧额、第九天 我趴在偏房一處隱蔽的房頂上張望厘肮。 院中可真熱鬧,春花似錦睦番、人聲如沸类茂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽巩检。三九已至,卻和暖如春示启,著一層夾襖步出監(jiān)牢的瞬間兢哭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工夫嗓, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留迟螺,地道東北人。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓舍咖,卻偏偏與公主長得像矩父,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子排霉,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Okhttp之Get請求 一.Okhttp基本使用 二.Request不論是同步請求還是異步請求窍株,都會往Okhtt...
    火燭明閱讀 415評論 0 0
  • 前言 用OkHttp很久了,也看了很多人寫的源碼分析,在這里結(jié)合自己的感悟夹姥,記錄一下對OkHttp源碼理解的幾點心...
    Java小鋪閱讀 1,504評論 0 13
  • 用OkHttp很久了杉武,也看了很多人寫的源碼分析,在這里結(jié)合自己的感悟辙售,記錄一下對OkHttp源碼理解的幾點心得轻抱。 ...
    藍灰_q閱讀 4,261評論 4 34
  • 這篇文章主要講 Android 網(wǎng)絡(luò)請求時所使用到的各個請求庫的關(guān)系,以及 OkHttp3 的介紹旦部。(如理解有誤祈搜,...
    小莊bb閱讀 1,148評論 0 4
  • 很多人都喜歡用淡雅 脫俗 純粹 來命名 這是有品的人追求的 然而 每次我想用它們來命名時 卻不忍 不忍將它變得不淡...
    秦林清箏閱讀 324評論 0 0