開源框架——圖片加載和緩存方案總結

提到圖片加載和緩存方案,咱們可能會馬上想到Flide,Fresco等框架,但除了這些還有沒有別的?Android開發歷史上都有哪些有名的圖片加載和緩存方案呢?它們各方面的性能對比狀況怎麼樣?誰更有優點?誰佔統治地位呢?今天咱們就來簡單總結一下以前都有哪些框架曾經輝煌過,如今又是那個框架的天下。

一、BitmapFun

們先來看下BitmapFun,BitmapFun函數庫是Android官方教程中的一個圖片加載和緩存實例,對於簡單的圖片加載需求來講,使用BitmapFun就夠了。git

它的原理很簡單,符合如今流行的圖片加載和緩存方案。在獲取圖片時首先從內存緩存中查找,如未找到圖片對象,則到本地sdCard卡上查找,若是仍是未查到,再去網絡請求。網絡請求,並下載成功後,先保存原圖到某個目錄下,而後再將原圖根據要求進行縮放,縮放後的圖片保存成另外一個圖片,方便使用。github

可是講真,先不說BitmapFun性能怎樣,它使用起來確實很麻煩。在使用前先要搞清楚ImageWorker,BitmapWorkerTask,ImageCache,DiskLruCache,ImageResizer,ImageFetcher等等這些類都是作什麼的,而後它們是怎樣配合使用的,因此要想用好它們有必定的學習門檻。面試

在早期Android開發中,由於沒有其它選擇,因此BitmapFun用的比較多,但如今已經退出了實際項目的開發舞臺。小程序

二、Android-Universal-Image-Loader

簡稱,UIL或者ImageLoader。這個框架老司機們應該不陌生,它曾經是圖片加載框架中的王者,Android開發老手們都用過它。緩存

github地址爲:github.com/nostra13/An…性能優化

UIL與gilde最大區別是可定製化,不管線程池,下載器,仍是解碼器均可以高度自定義。bash

它提供一系列配置選項,能很好地控制圖片加載和緩存的過程。網絡

主要特徵以下:多線程

  • 同步或異步的多線程圖片加載。
  • 高度可自定義:線程池、下載器、解碼器、內存和磁盤緩存、圖片顯示選項等。
  • 每張圖片的顯示支持多種自定義選項:默認存根圖片、解碼選項、Bitmap處理和顯示等。
  • 圖片可緩存在內存或者磁盤(設備的文件系統或者SD卡)上。
  • 可實時監聽圖片加載流程,包括下載進度。

UIL還提供了大量配置方式,如圖片加載狀態的回調(成功,失敗,進行中),加載動畫等;以及提供了移動端圖片加載框架的緩存思路:三級緩存策略 內存-sd卡-網絡。架構

整個UIL庫分爲 ImageLoaderEngine,Cache 及 ImageDownloader,ImageDecoder,BitmapDisplayer,BitmapProcessor 五大模塊,其中 Cache又分爲 MemoryCache 和 DiskCache 兩部分。

隨着google,facebook發佈本身的圖片加載和緩存框架,UIL佔的份額愈來愈小,但仍有至關部分人在使用它。

三、Picasso

Picasso是著名的square公司的一個開源項目,它除了實現圖片的下載和二級緩存功能,還解決了常見的一些問題,如,在adapter中正常的處理ImageView回收和下載的取消問題;使用盡可能小的內存實現複雜的圖像變換等問題。

整個庫分爲Dispatcher、RequestHandler、Downloader、PicassoDrawable等模塊。

它具備以下優勢:

  • 自帶統計監控功能,支持圖片緩存使用的監控,包括緩存命中率、已使用內存大小、節省的流量等。
  • 支持優先級處理,選擇優先級高的任務優先處理。
  • 支持飛行模式、併發線程數根據網絡類型而變。根據網絡類型來決定最大併發數,而不是CPU的核數。
  • 將本地緩存交給okhttp。Picasso本身沒有實現本地緩存,而是交給了okhttp去實現,這樣的好處是能夠經過請求okhttp來控制圖片的過時時間。

它的使用很簡單,咱們使用一行代碼便可實現圖片下載並渲染到ImageView中。

Picasso.with(context).load(url).into(imageView);
複製代碼

官網地址爲: square.github.io/picasso/

github地址爲:github.com/square/pica…

能夠看到,目前爲止已經有超過16.5k+個star,略高於UIL的start。

四、Fresco

Fresco是Facebook開源的功能強大的圖片加載和緩存函數庫,相比其餘圖片緩存庫,Fresco最顯著的特色是具備三級緩存:兩級內存緩存和一級磁盤緩存。

主要特性以下:

  • 漸進式地加載JPEG圖片。
  • 支持顯示GIF和WebP動畫。
  • 可擴展,可自定義圖片加載和顯示。
  • 在Android 4.X以上的系統上,能將圖片放在Android內存一個特殊的區域,從而使得應用運行更流暢,同時極大減低出現OutOfMemoryError的錯誤。

Fresco 能夠看作成一個強大的圖片加載組件。其設計有一個叫作 image pipeline 的模塊,負責從網絡,從本地文件系統,本地資源加載圖片。爲了最大限度節省空間和CPU時間,它含有3級緩存設計(2級內存,1級文件)。還設計有一個叫作 Drawees 模塊,方便顯示loading圖,當圖片再也不顯示在屏幕上時,及時地釋放內存和空間佔用。Fresco 支持 Android2.3(API level 9) 及其以上系統。

官網地址: www.fresco-cn.org/

github地址爲:github.com/facebook/fr…

目前爲止已經有超過15.4k+個star。

在管理圖片內存領域上有着本身一套獨特的方法,在漸進式加載、支持gif等都是它與位列前茅的特性。

五、Glide

Glide是Google推薦的用於Android平臺上的圖片加載和緩存函數庫。這個庫被普遍應用在Google的開源項目中,Glide和Picasso有90%的類似度,只是在細節上仍是存在很多區別。

用一句話介紹是:glide是一款專一於提供流暢划動能力的「圖片加載和緩存框架」

Glide爲包含圖片的滾動列表作了儘量流暢的優化。除了靜態圖片,Glide也支持GIF格式圖片的顯示。Glide提供了靈活的API可讓開發者方便地替換下載圖片所用的網絡函數庫,默認狀況下,它使用HttpUrlConnection做爲網絡請求模塊,開發者也能夠根據本身項目的實際需求靈活使用Google的Volley或者Square的OkHttp等函數庫進行替換。

整個庫分爲 RequestManager(請求管理器),Engine(數據獲取引擎)、Fetcher(數據獲取器)、MemoryCache(內存緩存)、DiskLRUCache、Transformation(圖片處理)、Encoder(本地緩存存儲)、Registry(圖片類型及解析器配置)、Target(目標)等模塊。

Glide 優勢:

  • 強大的緩存能力。Glide 不只是支持圖片緩存,它支持 Gif、WebP、縮略圖,甚至是 Video類型格式。
  • 支持優先級處理,通常的框架這兩項很難作到。
  • 與 Activity/Fragment 生命週期一致,支持 trimMemory 。
  • 支持 okhttp、Volley擴展。Glide 默認經過 UrlConnection 獲取數據,能夠配合 okhttp 或是 Volley 使用。另外,ImageLoader、Picasso也都支持 okhttp、Volley。
  • 友好的內存設計。能夠緩存更小的圖片,圖片默認使用RGB565 而不是 ARGB888,能夠節省內存佔用。

github址爲:github.com/bumptech/gl…

25.1k個star,是圖片加載類框架排名第一的框架,遙遙領先於其它框架。google 在2014開發者大會上演示的camera app就是基於gilde框架開發的。

它的使用方法很是簡單,加載圖片可使用一行代碼來完成。

Glide.with(context).load(url).into(imageView);
複製代碼

拋開BitmapFun不提,咱們看下4個框架的對比,

6.總結

有了以上對比,我相信你們在選擇圖片加載和緩存方案時,心中已經基本有方向了。

想學習更多Android知識,或者獲取相關資料請加入Android開發交流羣:1018342383。 有面試資源系統整理分享,Java語言進階和Kotlin語言與Android相關技術內核,APP開發框架知識, 360°Android App全方位性能優化。Android前沿技術,高級UI、Gradle、RxJava、小程序、Hybrid、 移動架構師專題項目實戰環節、React Native、等技術教程!架構師課程、NDK模塊開發、 Flutter等全方面的 Android高級實踐技術講解。還有在線答疑

相關文章
相關標籤/搜索