前言
OKHttp是square這個(gè)牛叉到帥的一塌糊涂的公司搞的一個(gè)網(wǎng)絡(luò)請(qǐng)求解決方案,github地址:square/okhttp,有多牛叉不多說(shuō)蚊惯,Google最新的sdk中已經(jīng)替換掉HttpClient相關(guān)API了的吆倦。
網(wǎng)絡(luò)請(qǐng)求基本workflow
直接先上圖吧
來(lái)我們看圖說(shuō)話吧,無(wú)論是哪個(gè)HTTP開(kāi)源庫(kù)還是自己折騰封裝的網(wǎng)絡(luò)庫(kù)都可以抽象的看出上面的流程圖抄瓦,發(fā)送一次請(qǐng)求無(wú)非一下幾步
1.build request(API參數(shù)配置)
2.executor(這里可以有很多變體潮瓶,比如有無(wú)隊(duì)列,進(jìn)出順序钙姊,線程管理)
3.parse callback(解析數(shù)據(jù)毯辅,返回T給上層)
OKHttp的workflow
OKHttp再牛叉workflow也無(wú)非如此,還是先上圖吧
看上圖說(shuō)話煞额,即使沒(méi)用過(guò)OKHttp看完此圖也能大概寫(xiě)出如何使用它的偽代碼來(lái)
val client = OkHttpClient.Builder.build()
val request = Request("url",.....)
val response = client.newCall(request).execute()
好思恐,那我們看看實(shí)際代碼是什么樣子的
wow~nice.跟剛才寫(xiě)的偽代碼幾乎差不多~沾谜,所以一個(gè)框架封裝的好壞,直接決定是否受人喜歡壁袄。流程圖越清楚类早,閱讀起來(lái)更容易。
好了言歸正傳不扯淡了的,來(lái)看具體實(shí)現(xiàn)吧嗜逻。
1.OkHttpClient
OkHttp的門面涩僻,一個(gè)好的框架,幾乎都流行這么干栈顷,比如Android-Universal-Image-Loader,Glide等逆日,都是采用門面模式,更加好記憶一些萄凤,自己寫(xiě)功能模塊的時(shí)候也經(jīng)常會(huì)寫(xiě)類似***Manager之類的室抽。負(fù)責(zé)基本的配置builder,對(duì)外API等靡努。
2.RealCall
顧名思義坪圾,真正的call,什么鬼惑朦,難道還有假的call?
看剛才給的代碼中兽泄,client.newCall(request) 這里有一個(gè)call,我們看一下OkHttpClient源碼
OkHttpClient實(shí)現(xiàn)了Call.Factory的newCall接口,根據(jù)request創(chuàng)建RealCall漾月。RealCall為具體的Call實(shí)現(xiàn)病梢。RealCall有兩個(gè)對(duì)外的核心方法,一種是同步直接返回結(jié)果的execute梁肿,另一種是入列處理的enqueue蜓陌。
execute的代碼,紅色部分就是執(zhí)行了一個(gè)處理吩蔑,獲取得到response
enqueue的代碼钮热,與execute不同的是這里是放到了一個(gè)叫做dispatch中去處理了的
簡(jiǎn)單提一句,new AsyncCall烛芬,這個(gè)類霉旗,不難推斷就是一個(gè)Runnable,在run里面調(diào)用和execute一樣的網(wǎng)絡(luò)處理拿到response蛀骇,然后responseCallback回去厌秒,這里就不做展開(kāi)了的。
3.Dispatcher
顧名思義擅憔,分發(fā)鸵闪,就是請(qǐng)求task的線程管理咯,展開(kāi)代碼頭部暑诸,就一目了然了的蚌讼。負(fù)責(zé)維護(hù)隊(duì)列用的辟灰。把剛才的AsyncCall根據(jù)當(dāng)前的策略加入到隊(duì)列中去執(zhí)行。具體實(shí)現(xiàn)也離不開(kāi)ExecutorService篡石。
小結(jié)一下
OkHttpClient實(shí)現(xiàn)Call.Factory芥喇,負(fù)責(zé)為Request創(chuàng)建Call;RealCall為具體的Call實(shí)現(xiàn)凰萨,其enqueue()異步接口通過(guò)Dispatcher利用ExecutorService實(shí)現(xiàn)继控,而最終進(jìn)行網(wǎng)絡(luò)請(qǐng)求時(shí)和同步execute()接口一致,都是通過(guò)getResponseWithInterceptorChain()函數(shù)實(shí)現(xiàn)胖眷;
小小的想法
文章看到這里武通,我只是簡(jiǎn)單拆了最表層的workflow,幾個(gè)核心類珊搀,但是耗時(shí)的操作最外層都是這樣的冶忱,你可以幾乎只需要換掉getResponseWithInterceptorChain這里的返回response,改為bitmap境析,ok囚枪,他就成了傳說(shuō)中的imageLoader了的,換成其他的業(yè)務(wù)需求劳淆,返回對(duì)應(yīng)的業(yè)務(wù)的taskResponse即可輕松搞定.這種workflow已經(jīng)是一個(gè)成熟的耗時(shí)操作框架的三部曲了的眶拉。