標籤:
流行架構
目前使用非常廣泛的架構技術主要有Android Universal Image Loader,Picasso, Glide和Fresco,最開始出現的應該算是UIL(Universal Image Loader),記得剛開始用圖片載入架構的時候,主要就是使用UIL,UIL功能豐富。Picasso是Square搞出來的,Glide與Picasso比較類似,Google推薦Glide,Fresco是Facebook推出的一個圖片載入庫,這個庫非常值得一看,裡面有很多很有特色的地方,非常強大的一個開源庫。除此之外Volley也是一個很好的圖片載入架構,非常輕量。
基本架構
這些架構基本都可以分成這麼幾個部分:執行引擎(Engine,或者說調度中心),請求產生部分,緩衝部分,圖片處理部分,圖片顯示部分。這基本涵蓋了圖片從網路或本地擷取過來,顯示給使用者的整個流程。
比較
關於他們之間的比較,可以參考Trinea的文章Android 三大圖片緩衝原理、特性對比,下面簡單介紹一下他們的優缺點:
- Android-Universal-Image-Loader: 是最早的圖片載入庫,應用也最廣泛,功能非常豐富。它支援下載監聽,提供了很多緩衝演算法,可以在滾動中暫停載入
- Picasso:
Square推出的開源庫,它支援圖片緩衝監控,按照優先順序來載入圖片
- Glide
Google推薦的圖片載入開源庫,支援gif(利用的是第三方包),webp,縮圖,video。提供了介面讓使用者使用自己需要的網路通訊協定棧。另外一方面,Glide可以與Activity/Fragment的周期保持一致,並且提供了trimMemory供使用。
- Fresco
facebook 推出的圖片載入開源庫,功能非常強大。主要有記憶體管理,漸進式載入,webp格式,gif,pipeline載入。
相關源碼分析文章
網路上面關於這些圖片開源架構的源碼分析還是挺多的,不過這些源碼分析一般都僅供參考輔助,如果自己需要瞭解這些源碼的內容,最好自己親自去看看源碼。
Android-Universal-Image-Loader: Android Universal Image Loader 源碼分析
Picasso: http://blog.happyhls.me/category/android/picasso/
http://skykai521.github.io/2016/02/25/Picasso%E6%BA%90%E4%BB%A3%E7%A0%81%E5%88%86%E6%9E%90/
Glide: Android Glide源碼解析
Fresco: Fresco-Source-Analysis
相關特性gif
目前Glide和Fresco都支援gif。對於gif,Fresco的處理跟我們對gif的理解是一致的,先將gif的所有幀解碼出來,然後使用動畫一幀一幀地放。具體是通過變化Drawable的繪製,每次繪製的時候,繪製對應的一幀:
private boolean renderFrame( Canvas canvas, int frameNumber, int frameMonotonicNumber) { CloseableReference<Bitmap> bitmapReference = mAnimatedDrawableBackend.getBitmapForFrame(frameNumber); if (bitmapReference != null) { canvas.drawBitmap(bitmapReference.get(), 0f, 0f, mPaint); if (mLastDrawnFrame != null) { mLastDrawnFrame.close(); } if (mIsRunning && frameMonotonicNumber > mLastDrawnFrameMonotonicNumber) { int droppedFrames = frameMonotonicNumber - mLastDrawnFrameMonotonicNumber - 1; mAnimatedDrawableDiagnostics.incrementDrawnFrames(1); mAnimatedDrawableDiagnostics.incrementDroppedFrames(droppedFrames); if (droppedFrames > 0) { FLog.v(TAG, "(%s) Dropped %d frames", mLogId, droppedFrames); } } mLastDrawnFrame = bitmapReference; mLastDrawnFrameNumber = frameNumber; mLastDrawnFrameMonotonicNumber = frameMonotonicNumber; FLog.v(TAG, "(%s) Drew frame %d", mLogId, frameNumber); return true; } return false; }
webp
WebP是google推出的一種新的影像形式,他可以對圖片進行有效地壓縮又不影響圖片的相容性和實際清晰度,提高圖片下載速度,在相同品質它壓縮後的體積大概是jpg的40%。但是編碼時間大概比jpg的長8倍。目前Facebook跟QQ空間都有使用WebP圖片。
漸進載入
這個是Fresco提供的功能,目前只支援jpg網狀圖片。可以在片的時候,讓圖片逐漸地由模糊變清晰漸漸地顯示出來。jpeg格式的圖片有兩種方式,一種是直接編碼的,另外一種是漸進式編碼的,能夠用於Fresco漸進載入的是要通過漸進式編碼的jpeg圖片。壓縮標準。
Android Bitmap深入介紹(三)--- 開源載入架構簡述