圖片加載

本章目錄

  • Part One:Picasso,Glide和Fresco對(duì)比
  • Part Two:Glide簡(jiǎn)單應(yīng)用

圖片加載是Android中最基礎(chǔ)的功能之一,同時(shí)也是最容易造成OOM的起因之一。如果加載的圖片過大,或者加載的圖片過多,內(nèi)存溢出就不可避免了。
自從Github上高達(dá)1.5W顆星的老牌圖片加載第三方# Android-Universal-Image-Loader宣布不再維護(hù)之后,當(dāng)前市面主流的就剩三個(gè):Picasso,Glide和Fresco。

Part One:Picasso,Glide和Fresco對(duì)比

先來看一下這三者的一個(gè)基本對(duì)比

對(duì)比項(xiàng) Picasso Glide Fresco
地址 github.com/square/pica… github.com/bumptech/gl… github.com/facebook/fr…
發(fā)布時(shí)間 2013年5月 2014年9月 2015年5月
是否支持gif false true true
是否支持webP true true true
視頻縮略圖 false true true
大小 100k 500 KB 2~3M
加載速度
Disk+Men Cache true true true
Easy of use low mediun difficult
star 13160 14709 12444
開發(fā)者 Square主導(dǎo) Google主導(dǎo) Facebook主導(dǎo)

盡管從數(shù)據(jù)統(tǒng)計(jì)來看,這三者的功能有所差異,但其實(shí)都已基本滿足我們開發(fā)的需要,用哪個(gè)都行。只有極其特殊的情況,才需要擇優(yōu)考慮。
Picasso:如果項(xiàng)目需要使用的圖片資源不多可以使用,比如我們一直在講的案例。

  • 優(yōu)點(diǎn):包小,容易使用;
  • 缺點(diǎn):性能相對(duì)差一些

Glide:如果需要大量加載靜態(tài)圖片,不需要加載太多GIF時(shí),可以使用。

  • 優(yōu)點(diǎn):包和使用難度都適中,靜態(tài)圖片加載效率好,生命周期集成,內(nèi)存開銷小
  • 缺點(diǎn):GIF加載慢,沒有文件緩存

Fresco:兼容性能不高的手機(jī),還有大批量加載各種類型圖片可以使用。

  • 優(yōu)點(diǎn):為Android5.0以下的手機(jī)單獨(dú)開辟區(qū)域,兼容性好,在native層處理圖片,減少OOM
  • 缺點(diǎn):包大,使用難度大,學(xué)習(xí)成本高。

Part Two:Glide簡(jiǎn)單應(yīng)用

Glide的4.0+版本使用一個(gè)注釋處理器生成了一個(gè)API,允許應(yīng)用程序訪問的所有選項(xiàng)RequestBuilder,RequestOptions以及任何包含集成庫(kù)在一個(gè)流暢的API。
生成的API有兩個(gè)目的:集成庫(kù)可以通過自定義選項(xiàng)擴(kuò)展Glide的API,并且應(yīng)用程序可以通過添加捆綁常用選項(xiàng)的方法來擴(kuò)展Glide的API。
盡管這兩個(gè)任務(wù)都可以通過編寫RequestOptions的自定義子類來手工完成,但是這樣做是具有挑戰(zhàn)性的,并且會(huì)產(chǎn)生一個(gè)不那么流暢的API。
下面來看看具體怎么使用。

  1. 導(dǎo)包
    先在project的build.gradle里面添加倉(cāng)庫(kù)地址
repositories {
  mavenCentral()
  maven { url 'https://maven.google.com' }
}

然后添加依賴包即可

dependencies {
  compile 'com.github.bumptech.glide:glide:4.3.1'
  annotationProcessor 'com.github.bumptech.glide:compiler:4.3.1'
}
  1. 創(chuàng)建一個(gè)類繼承AppGlideModule,并添加注解@GlideModule
package com.terana.customview.tools;

import com.bumptech.glide.annotation.GlideModule;
import com.bumptech.glide.module.AppGlideModule;

@GlideModule
public final class MyAppGlideModule extends AppGlideModule{
}

這里需要注意的是,AppGlideModule實(shí)現(xiàn)必須始終注釋@GlideModule。如果注釋不存在,則不會(huì)發(fā)現(xiàn)該模塊,并且您將在日志中看到一條帶有Glide日志標(biāo)記的警告,該日志標(biāo)記指示該模塊無法找到。

  1. 生成GlideApp

創(chuàng)建好類后,需要依次點(diǎn)擊 Build -> Make Project,這時(shí)候會(huì)發(fā)現(xiàn)自定義的AppGlideModle被注入到GeneratedAppGlideModuleImpl里面。

  1. 在Adapter中應(yīng)用GlideApp
GlideApp.with(context).load(bean.getPhotoResId())
                .centerCrop()
                .into(holder.photoImeView);

這里的with:

  • with(Context context). 使用Application上下文,Glide請(qǐng)求將不受Activity/Fragment生命周期控制。
  • with(Activity activity).使用Activity作為上下文,Glide的請(qǐng)求會(huì)受到Activity生命周期控制。
  • with(FragmentActivity activity).Glide的請(qǐng)求會(huì)受到FragmentActivity生命周期控制。
  • with(android.app.Fragment fragment).Glide的請(qǐng)求會(huì)受到Fragment 生命周期控制。
  • with(android.support.v4.app.Fragment fragment).Glide的請(qǐng)求會(huì)受到Fragment生命周期控制。

這里的load:
load SD卡資源:load("file://"+Environment.getExternalStorageDirectory().getPath()+"/test.jpg")
load assets資源:load("file:///android_asset/f003.gif")
load raw資源:load("android.resource://com.frank.glide/raw/raw_1")或load("android.resource://com.frank.glide/raw/"+R.raw.raw_1)
load drawable資源:load("android.resource://com.frank.glide/drawable/news")或load("android.resource://com.frank.glide/drawable/"+R.drawable.news)
load ContentProvider資源:load("content://media/external/images/media/139469")
load http資源:load("http://img.my.csdn.net/uploads/201508/05/1438760757_3588.jpg")
load https資源:load("https://img.alicdn.com/tps/TB1uyhoMpXXXXcLXVXXXXXXXXXX-476-538.jpg_240x5000q50.jpg_.webp")

當(dāng)然,load不限于String類型,還可以:
load(Uri uri),load(File file),load(Integer resourceId)load(URL url),load(byte[] model),load(T model),loadFromMediaStore(Uri uri)。


基本的應(yīng)用就差不多了,Glide還有很多其它復(fù)雜的應(yīng)用就不贅述了,需要的時(shí)候現(xiàn)查吧。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容