Glide 為什么優秀

Android 開發中需要處理圖片的地方很多,但如何針對 Android 平臺的特性,將圖片這件不簡單的事情,做到順滑流暢則沒那么簡單。今天就分析下,Google 推薦的 Glide 開源框架,看看這個框架如何做好這件不簡單的事情。

Glide 為什么優秀?

首先來分析下,一個優秀的圖片庫應該具有什么樣的特性?

  1. 易用性。這對于絕大多數開源庫而言,都是需要做到的,但這又是很難的一方面。舉個例子,圖片庫涉及到網絡、緩存、編碼等等各個環節,但這些環節不應該讓所有用戶都知曉,應該拿捏到這種力度:用戶可以不知曉,有需求的可以進行自定義。開源庫可能有很多類用戶可以涉及,但最好有統一的外觀(Facade Pattern),Glide 在這點上就做得足夠好。
  2. 擴展性。需求這東西嘛,總是比天氣變化快多了,設計的開源庫就必須得有很好的擴展性。無論是 Volley,Glide 還是其他知名開源庫,在這點上都做得很好。關鍵在于抽象::不變的與變化的::,變化的是 網絡編碼緩存等等模塊,不變的是它們之間是如何銜接的。在合理的抽象建模下,還是很容易高的擴展性的。
  3. 高性能與低占用。這是圖片庫最核心的部分,也是最難的部分。難點在于三個方面。
    • 內存受限。受限于移動終端的低內存,如果占用內存過大,會使得分配變得低效,不穩定。如果復用不給力,高頻率的分配內存,會導致GC頻繁,從而卡頓。
    • 流暢性。Android 系統中的圖片常用于 RecyclerView,GridView 中,這些控件往往展示著大量的圖片,在這些圖片頻繁加載、編碼等等情況下,保證滑動流暢呢?
    • 生命周期。Android的UI組件有各個周期,Glide 要在盡可能少入侵代碼的前提下,參與到生命周期里面去,從而合理地分配和釋放資源。

Glide 如何做到易用性的?

本節和后序的章節,暫不涉及具體的源碼,后續的文章再做分析。要想要讓 Glide 易用,主要還是在 API 的設計上面。這里提出一個概念,鏈式調用,是指一些方法能夠直接通過.的形式進行連接。

Glide.with(this).load(url).placeholder(resId).error(resId).into(mImageView);

上面的代碼就是一個鏈式調用的例子,將 Glide 需要配置的地方,用一行代碼就可以表達出來。我們常見的 RxJava、Java Builder 等等都采用了這種方式。

除了鏈式調用以外,Glide 的易用性,還提現在完善的職能模塊,簡單明了的接口。用戶可以根據自身的需要進行自定義,也可以使用默認的方案。

Glide API

如上圖所示,Glide 將用戶能夠自定義的內容,都通過模塊和相應的接口暴露出來,開發者可以根據自身需要,只對部分模塊進行自定義即可。

Glide 如何實現高的擴展性?

高的擴展性前提就是清晰的模塊劃分,只有在這種情況下,模塊才能進行插拔替換,從而實現擴展性。

Glide Module

Glide 在大體上劃分為RequestCacheModuleDecode 等等模塊,統一由Registry進行管理。在這個基礎上,Glide 就能實現很好的擴展性。例如 Request模塊,即可以使用默認的,也可以使用Volley或者OKHttp

Glide 如何實現好的性能?

Glide 的性能方面的掌控,主要由三個方面來實施的。

  1. 良好的復用模塊。這是最核心的部分,當這塊內存能夠不斷地被循環使用,能減少 GC 和分配的次數。內存操作一般情況下,都是 Stop the world 的,UI 線程也會因此中斷,因而這對 APP 的性能極為關鍵。復用手段包括,但不止 LruCacheObject Pool
  2. 本地化的生命周期。對于圖片資源的釋放,很少在保證即時性的情況下,又不需要開發者感知的。Glide 通過一個小技巧達成了目的,后續文章具體介紹哈。
  3. 對 RecyclerView 等等控件的細節調優。不要小看這些細節,羅馬就是這么搭建出來的,摳的這些小細節,才是大師所為。

文檔信息


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,002評論 6 542
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,400評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,136評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,714評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,452評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,818評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,812評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,997評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,552評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,292評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,510評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,035評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,721評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,121評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,429評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,235評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,480評論 2 379

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,723評論 25 708
  • 發現 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,170評論 4 61
  • Learn-Android 本收集來源于git上,原版本地址:https://github.com/Tim9Liu...
    仕明同學閱讀 2,277評論 0 36
  • ?你血液里跑滿 愛的悵茫嗎 果園的月亮 伏在無形的柵欄上 用一注少年女孩的默視 戳在你的難言之處 而你幽暗的生命里...
    劉培強閱讀 258評論 0 2
  • 黃土內埋藏著野心與尸骨! 塵世里遺留著眷戀與悔恨!
    云散月彷徨閱讀 116評論 0 0