}先來看 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...