Yelp app是如何使用Glide優(yōu)化圖片加載的

@author 菠蘿的 ?泡在網(wǎng)上的日子

原文:Glide – How Yelp’s Android App Loads Images

動(dòng)態(tài)加載圖片是很多安卓應(yīng)用的基礎(chǔ)呐伞。在Yelp(美國(guó)最大點(diǎn)評(píng)網(wǎng)站)中,圖片在把消費(fèi)者與商家聯(lián)系起來的過程中至關(guān)重要遂黍。隨著網(wǎng)絡(luò)通信和硬件水平的越發(fā)強(qiáng)大,消費(fèi)者對(duì)于圖片數(shù)量和圖片質(zhì)量的期望日益增長(zhǎng)俊嗽。圖片可以輕易的成為內(nèi)存和網(wǎng)絡(luò)流量的消耗大戶雾家,處理圖片數(shù)據(jù)的下載和管理成為了一個(gè)讓人望而卻步的任務(wù)。我們探索了幾種處理這個(gè)問題的解決辦法绍豁,最終認(rèn)為Glide在性能芯咧,使用方便性,穩(wěn)定性上達(dá)到了相當(dāng)好的平衡竹揍。

Glide最簡(jiǎn)單的使用案例就是從遠(yuǎn)程服務(wù)器或者本地文件系統(tǒng)加載圖片敬飒,把它們放在磁盤與內(nèi)存緩存中,然后加載到view上芬位。它可以用在全市圖片的app中无拗,Glide為包含圖片的滾動(dòng)列表做了盡可能流暢的優(yōu)化。

對(duì)象池

Glide原理的核心是為bitmap維護(hù)一個(gè)對(duì)象池昧碉。對(duì)象池的主要目的是通過減少大對(duì)象的分配以重用來提高性能(至于對(duì)象池的概覽蓝纲,可以查看這個(gè)Android performance pattern 視頻)阴孟。

Dalvik和ART虛擬機(jī)都沒有使用compacting garbage collector,compacting garbage collector是一種模式税迷,這種模式中GC會(huì)遍歷堆,同時(shí)把活躍對(duì)象移到相鄰內(nèi)存區(qū)域锹漱,讓更大的內(nèi)存塊可以用在后續(xù)的分配中箭养。因?yàn)榘沧繘]有這種模式,就可能會(huì)出現(xiàn)被分配的對(duì)象分散在各處哥牍,對(duì)象之間只有很小的內(nèi)存可用毕泌。如果應(yīng)用試圖分配一個(gè)大于鄰近的閑置內(nèi)存塊空間的對(duì)象,就會(huì)導(dǎo)致OutOfMemoryError嗅辣,然后崩潰撼泛,即使總的空余內(nèi)存空間大于對(duì)象的大小。

使用對(duì)象池還可以幫助提高滾動(dòng)的性能澡谭,因?yàn)橹赜胋itmap意味著更少的對(duì)象被創(chuàng)建與回收愿题。垃圾回收會(huì)導(dǎo)致“停止一切(Stop The World)”事件,這個(gè)事件指的是回收器執(zhí)行期間蛙奖,所有線程(包括UI線程)都會(huì)暫停潘酗。這個(gè)時(shí)候,圖像幀無法被渲染同時(shí)UI可能會(huì)停滯雁仲,這在滾動(dòng)期間尤其明顯仔夺。

Glide的使用

Glide使用起來很簡(jiǎn)單,而且不需要任何特別的配置就自動(dòng)包含了bitmap pooling 攒砖。

DrawableRequestBuilder requestBuilder = Glide.with(context).load(imageUrl);

requestBuilder.into(imageView);

這就是加載一張圖片的全部要求缸兔。就像安卓中的很多地方一樣,with() 方法中的context到底是哪種類型是不清楚的吹艇。有一點(diǎn)很重要需要記住惰蜜,就是傳入的context類型影響到Glide加載圖片的優(yōu)化程度,Glide可以監(jiān)視activity的生命周期掐暮,在activity銷毀的時(shí)候自動(dòng)取消等待中的請(qǐng)求蝎抽。但是如果你使用Application?context,你就失去了這種優(yōu)化效果路克。

譯者注:其實(shí)以上的代碼是一種比較規(guī)范的寫法樟结,我們更熟悉的寫法是:

Glide.with(context).load("http://inthecheesefactory.com/uploads/source/glidepicasso/cover.jpg").into(ivImg);

優(yōu)化特性

類似的是,如果相關(guān)的item已經(jīng)滾出了屏幕的范圍精算,Glide會(huì)自動(dòng)取消列表中的懸著的圖片請(qǐng)求 瓢宦。因?yàn)榻^大多數(shù)開發(fā)者都會(huì)在adapter中利用view的回收,Glide做到這點(diǎn)是通過在ImageView上設(shè)置一個(gè)tag灰羽,在加載另外一張圖片之前檢查這個(gè)tag驮履,如果存在就取消第一次請(qǐng)求鱼辙。

Glide提供了幾個(gè)讓你感覺圖片加載速度變快的特性。第一個(gè)就是在圖片顯示在屏幕上之前就預(yù)先取出圖片玫镐。它提供了一個(gè)ListPreloader類倒戏, 它被應(yīng)該事先取出的item數(shù)目實(shí)例化。然后通過setOnScrollListener(OnScrollListener).被傳遞給ListView恐似。你想在ListView之外也能預(yù)先取出圖片嗎杜跷?沒問題,使用前面的builder對(duì)象就可以了矫夷,只需調(diào)用builder.downloadOnly()葛闷。

downloadOnly見:https://github.com/bumptech/glide/wiki/Loading-and-Caching-on-Background-Threads

我們發(fā)現(xiàn)了Glide提供的可以大大提高性能双藕,穩(wěn)定性的功能淑趾,以及安卓圖片加載領(lǐng)域的一些設(shè)計(jì)哲學(xué)。這些特性和優(yōu)化確實(shí)可以很好的將圖片加載的體驗(yàn)變成一種享受忧陪。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末扣泊,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子赤嚼,更是在濱河造成了極大的恐慌旷赖,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,817評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件更卒,死亡現(xiàn)場(chǎng)離奇詭異等孵,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)蹂空,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門俯萌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人上枕,你說我怎么就攤上這事咐熙。” “怎么了辨萍?”我有些...
    開封第一講書人閱讀 157,354評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵棋恼,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我锈玉,道長(zhǎng)爪飘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,498評(píng)論 1 284
  • 正文 為了忘掉前任拉背,我火速辦了婚禮师崎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘椅棺。我一直安慰自己犁罩,他們只是感情好齐蔽,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著床估,像睡著了一般含滴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上丐巫,一...
    開封第一講書人閱讀 49,829評(píng)論 1 290
  • 那天蛙吏,我揣著相機(jī)與錄音,去河邊找鬼鞋吉。 笑死,一個(gè)胖子當(dāng)著我的面吹牛励烦,可吹牛的內(nèi)容都是我干的谓着。 我是一名探鬼主播,決...
    沈念sama閱讀 38,979評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼坛掠,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼赊锚!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起屉栓,我...
    開封第一講書人閱讀 37,722評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤舷蒲,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后友多,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體牲平,經(jīng)...
    沈念sama閱讀 44,189評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評(píng)論 2 327
  • 正文 我和宋清朗相戀三年域滥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了纵柿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,654評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡启绰,死狀恐怖昂儒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情委可,我是刑警寧澤渊跋,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站着倾,受9級(jí)特大地震影響拾酝,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜屈呕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評(píng)論 3 313
  • 文/蒙蒙 一微宝、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧虎眨,春花似錦蟋软、人聲如沸镶摘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽凄敢。三九已至,卻和暖如春湿痢,著一層夾襖步出監(jiān)牢的瞬間涝缝,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工譬重, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拒逮,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,382評(píng)論 2 360
  • 正文 我出身青樓臀规,卻偏偏與公主長(zhǎng)得像滩援,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子塔嬉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評(píng)論 2 349

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