OkHttp 原始碼分析

2021-08-23 12:38:40 字數 2999 閱讀 4959

}先來看 new okhttpclient()

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

@override

public

void

enqueue(callback responsecallback)

capturecallstacktrace();

eventlistener.callstart(this);

// 執行 dispatcher 的 enqueue 方法,dispatcher 是在建立 httpclient 物件時 new 的。注意這裡傳過去是的 new asynccall(responsecallback)

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

}

asynccall 是實現了 namedrunnable

public

abstract

class

namedrunnable

implements

runnable finally

}protected

abstract

void

execute();

}

可以看到就是實現的 runnable 介面,如果在乙個執行緒裡執行,執行的就是 execute 方法。再接著看 dispatcher 的 enqueue 方法

synchronized void enqueue(asynccall call)  else 

}

asynccall 執行的是 execute 方法,下面接著看這裡

@override protected

void execute() else

} catch (ioexception e) else

} finally

}response getresponsewithinterceptorchain() throws ioexception

// 請求伺服器

interceptors.add(new callserverinterceptor(forwebsocket));

// 開始鏈式呼叫

interceptor.chain chain = new realinterceptorchain(interceptors, null, null, null, 0,

originalrequest, this, eventlistener, client.connecttimeoutmillis(),

client.readtimeoutmillis(), client.writetimeoutmillis());

return chain.proceed(originalrequest);

}

來乙個鏈式呼叫的例子吧,

// 實際執行

public

static

void

main(string args)

// 執行鏈

public

class

interceptorchain

public

void

proceed()

interceptorchain chain = new interceptorchain(interceptors, index+1);

interceptor interceptor = interceptors.get(index);

interceptor.proceed(chain);

}}// interceptor

public

inte***ce

interceptor

public

class

interceptor1

implements

interceptor

}public

class

interceptor2

implements

interceptor

}

最終的執行結果是:

interceptor1 start

interceptor2 start

呼叫完

interceptor2 end

interceptor1 end

可以看到 1 先執行,在 1 裡面調 2 的執行,2 執行完的返回結果,1 可以再進行處理。

來一張**釋下吧

okhttp 的呼叫過程用下面的圖來簡介一下

OkHttp 原始碼分析(一)

首先我們來看一段 我們直接來看這一段 研究okhttpclient這個類之前,我們先來看看他都實現了那些類。這裡我們就很明白newcall 的來歷了。廢話不多說直接看okhttpclient的newcall方法。public class okhttpclient implements cloneab...

OkHttp原始碼分析(四)DiskLruCache

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

OkHttp原始碼初探

在之前的文章我中我們介紹了okhttp的基本使用方法並簡單說明了原始碼下各個module的功能作用,從這篇開始我們將要開始分析okhttp的原始碼。首先,我們先來回憶一下okhttp的使用過程 1.建立乙個okhttpclient物件 2.建立乙個request物件 3.呼叫okhttpclient...