OkHttp Cache緩存put 源碼分析

image
image

本來是應(yīng)該分析 CacheInterceptor 緩存攔截器的衙传,考慮到這需要對OkHttp的緩存 Cache 有一定的了解千扔,所以先分析 Cache 之后再對 CacheInterceptor 緩存攔截器進(jìn)行分析捉邢。

Cache緩存我的理解就是節(jié)省客服端下一次請求網(wǎng)絡(luò)的時間播急,更快的展示數(shù)據(jù)乳丰。

我們先看下是怎么樣使用這個功能的:

OkHttpClient client = new OkHttpClient.Builder()
                .cache(new Cache(new File("cache"),24*1024*1024))
                .build();

調(diào)用了 OkHttpClient 的內(nèi)部類 Buildercache() 方法,并傳入了一個 Cache 對象霎桅。 可以明白如果要使用緩存,只需要在創(chuàng)建 OkHttpClient 對象時配置 Cache 類就行了讨永。

接下來看下實(shí)例化 Cache 的構(gòu)造方法傳入?yún)?shù):


image.png

通過這個構(gòu)造方法就可以設(shè)置好緩存路勁和大小滔驶。

接下來我們繼續(xù)到 Cache 類的源碼中去查看:


image.png

Cache 的源碼上部分看到創(chuàng)建好了一個 InternalCache 對象,那這個 InternalCache 是個什么對象呢卿闹,點(diǎn)擊過去:


image.png

發(fā)現(xiàn)其實(shí)就是一個接口揭糕,在這接口中很多的方法(get,put锻霎,remove著角,update等等)。
這也就明白了這個 InternalCache 接口的所有方法實(shí)現(xiàn)都是通過 Cache 類來進(jìn)行實(shí)現(xiàn)的旋恼。

Cache的put方法



image.png

這是 put 方法的前面部分吏口,繼續(xù)看后面部分


image.png

后面部分東西還是挺多的,所以就以這種標(biāo)號的方式進(jìn)行分析,如下:

1:Entry 就是需要寫入緩存的內(nèi)容冰更。
到源碼中去查看:

image.png

可以看到 Entry 是一個 final 類产徊,里面包含了請求的一些參數(shù)(url,請求頭蜀细,請求方式舟铜,響應(yīng)頭等等),這個 Entry 類其實(shí)就是OkHttp把緩存中所需要的屬性進(jìn)行了封裝奠衔,成了一個包裝類谆刨,以便于我們進(jìn)行緩存。

2:DiskLruCache(緩存算法)——從而也就知道了OkHttp中的緩存是通過DiskLruCache實(shí)現(xiàn)的归斤。
Editor(DiskLruCache.Editor)DiskLruCache的內(nèi)部類痊夭,主要是用于寫入的。

3:cache其實(shí)就是一個DiskLruCache對象

image.png

4:key(...)方法脏里,到這個方法的源碼

image.png

可以清楚這個key()方法就是將請求的URL通過MD5的加密生兆,然后得到加密后的十六進(jìn)制的值。然后這個值也就是接下來緩存的key值。

5:cache.edit(...) 就是調(diào)用了DiskLruCacheedit()然后返回了Editor(DiskLruCache.Editor)對象

image.png

6:entry.writeTo(...) 剛剛知道entry就是緩存需要寫入的部分鸦难,然后調(diào)用writeTo()這個方法根吁。可以看看這個方法

image.png

image.png

image.png

可以知道在這個writeTo()方法中合蔽,就是把請求緩存寫入磁盤击敌。不僅僅緩存了響應(yīng)的頭部信息還緩存了請求的頭部信息。

"6" 中我們發(fā)下已近對請求的頭部響應(yīng)的頭部都進(jìn)了緩存拴事,那關(guān)鍵的響應(yīng)體Response的緩存呢沃斤?就是接下來的 "7" 了。

7:源碼是 return new CacheRequestImpl(editor);

image.png

知道這個put是返回了一個CacheRequest接口對象


image.png

CacheRequestImpl類中實(shí)現(xiàn)了這個CacheRequest接口


image.png

CacheRequestImpl類中為什么要去實(shí)現(xiàn)了這個CacheRequest接口呢刃宵,這就和 CacheInterceptor 緩存攔截器有關(guān)聯(lián)了衡瓶。主要是通過這個CacheRequest接口暴露給CacheInterceptor 緩存攔截器的,然后緩存攔截器就可以直接通過CacheRequestImpl實(shí)現(xiàn)類來更新和寫入緩存數(shù)據(jù)牲证。

到這個這個Cacheput方法都分析完了

put方法總結(jié)

1:首先判斷請求的請求方式是否符合緩存要求GET
2:創(chuàng)建以一個Entry對象哮针,包裝了用于緩存所需要的信息(url,頭部等等)
3:使用到DiskLruCache來進(jìn)行緩存的實(shí)際寫入
4:返回了一個CacheRequestImpl對象坦袍,這個對象主要是用于CacheInterceptor緩存攔截器的

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末十厢,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子捂齐,更是在濱河造成了極大的恐慌蛮放,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件奠宜,死亡現(xiàn)場離奇詭異包颁,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)压真,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門徘六,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人榴都,你說我怎么就攤上這事待锈。” “怎么了嘴高?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵竿音,是天一觀的道長。 經(jīng)常有香客問我拴驮,道長春瞬,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任套啤,我火速辦了婚禮宽气,結(jié)果婚禮上随常,老公的妹妹穿的比我還像新娘。我一直安慰自己萄涯,他們只是感情好绪氛,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著涝影,像睡著了一般枣察。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上燃逻,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天序目,我揣著相機(jī)與錄音,去河邊找鬼伯襟。 笑死猿涨,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的姆怪。 我是一名探鬼主播叛赚,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼片效!你這毒婦竟也來了红伦?” 一聲冷哼從身側(cè)響起英古,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤淀衣,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后召调,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體膨桥,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年唠叛,在試婚紗的時候發(fā)現(xiàn)自己被綠了只嚣。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡艺沼,死狀恐怖册舞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情障般,我是刑警寧澤调鲸,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站挽荡,受9級特大地震影響藐石,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜定拟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一于微、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦株依、人聲如沸驱证。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽雷滚。三九已至,卻和暖如春吗坚,著一層夾襖步出監(jiān)牢的瞬間祈远,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工商源, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留车份,地道東北人。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓牡彻,卻偏偏與公主長得像扫沼,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子庄吼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評論 2 345

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