本章目錄
- 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。
下面來看看具體怎么使用。
- 導(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'
}
- 創(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)記指示該模塊無法找到。
- 生成GlideApp
創(chuàng)建好類后,需要依次點(diǎn)擊 Build -> Make Project,這時(shí)候會(huì)發(fā)現(xiàn)自定義的AppGlideModle被注入到GeneratedAppGlideModuleImpl里面。
- 在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)查吧。