問(wèn)題描述
- 在使用 Matisse 與 glide 4.0.0 以及 4.0.0 之后的版本過(guò)程中官撼,發(fā)現(xiàn)通過(guò)
Matisse 的 wiki 代碼調(diào)用選取圖片的方式后吞杭,會(huì)出現(xiàn)本文標(biāo)題的錯(cuò)誤
1.以下為 wiki 調(diào)用代碼:
Matisse.from(MainActivity.this)
.choose(MimeType.allOf())
.countable(true)
.maxSelectable(9)
.addFilter(new GifSizeFilter(320, 320, 5 * Filter.K * Filter.K))
.gridExpectedSize(getResources().getDimensionPixelSize(R.dimen.grid_expected_size))
.restrictOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED)
.thumbnailScale(0.85f)
.imageEngine(new GlideEngine())
.forResult(REQUEST_CODE_CHOOSE);
2.以下為控制臺(tái)報(bào)出的錯(cuò)誤信息喊递,內(nèi)容過(guò)多袭艺,我就只截取了錯(cuò)誤標(biāo)題部分
java.lang.NoSuchMethodError: com.bumptech.glide.RequestManager.load
at com.zhihu.matisse.engine.impl.GlideEngine.loadThumbnail(GlideEngine.java:36)
at com.zhihu.matisse.internal.ui.widget.MediaGrid.setImage(MediaGrid.java:117)
at com.zhihu.matisse.internal.ui.widget.MediaGrid.bindMedia(MediaGrid.java:84)
問(wèn)題定位
- 通過(guò)報(bào)錯(cuò)信息庸诱,可以發(fā)現(xiàn)出現(xiàn)錯(cuò)誤的調(diào)用路徑,根據(jù)路徑依次查看粗卜,發(fā)現(xiàn)在類(lèi) GlideEngine.java中屋确,出現(xiàn)如下代碼:
@Override
public void loadThumbnail(Context context, int resize, Drawable placeholder, ImageView imageView, Uri uri) {
Glide.with(context)
.load(uri)
.asBitmap() // some .jpeg files are actually gif
.placeholder(placeholder)
.override(resize, resize)
.centerCrop()
.into(imageView);
}
其中,有一行顯示為紅色续扔,也就是說(shuō)攻臀,該行代碼出現(xiàn)錯(cuò)誤,導(dǎo)致程序的崩潰纱昧。
.asBitmap()
問(wèn)題分析
- 在問(wèn)題定位中刨啸,發(fā)現(xiàn) Matisse 在通過(guò) Glide 調(diào)用相關(guān) api 的時(shí)候出現(xiàn)錯(cuò)誤,因此识脆,問(wèn)題主要原因出現(xiàn)在 Glide 的使用上设联。通過(guò)查看 Glide 的 相關(guān)文檔,發(fā)現(xiàn) Glide 從 v3 到 v4 做了一些改動(dòng)灼捂。
- 在 相關(guān)文檔 中發(fā)現(xiàn)
Glide.with(fragment)
.asBitmap()
.apply(myOptions)
.load(url)
.into(bitmapView);
仔細(xì)看這里的內(nèi)容仑荐,這里 .asBitmap()
的調(diào)用是在 .load(url)
之前,而我們?cè)?問(wèn)題定位 中的代碼纵东, .asBitmap()
的調(diào)用是在 .load(url)
之后。隨后我在測(cè)試中啥寇,調(diào)換了兩者的位置偎球,發(fā)現(xiàn) .asBitmap()
在 .load(url)
之前調(diào)用沒(méi)有問(wèn)題,而在 .load(url)
之后調(diào)用辑甜,的確出現(xiàn)了本文所描述的問(wèn)題衰絮。
問(wèn)題解決
- 到此,問(wèn)題的原因已經(jīng)很明確了磷醋。下面來(lái)談?wù)剢?wèn)題的解決方式猫牡。
- 簡(jiǎn)單粗暴型的解決方式,將代碼中的
.imageEngine(new GlideEngine())
替換成.imageEngine(new PicassoEngine())
(注:需要 Picasso 依賴(lài))
Matisse.from(MainActivity.this)
.choose(MimeType.allOf())
.countable(true)
.maxSelectable(9)
.addFilter(new GifSizeFilter(320, 320, 5 * Filter.K * Filter.K))
.gridExpectedSize(getResources().getDimensionPixelSize(R.dimen.grid_expected_size))
.restrictOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED)
.thumbnailScale(0.85f)
//.imageEngine(new GlideEngine())
.imageEngine(new PicassoEngine())
.forResult(REQUEST_CODE_CHOOSE);
- 自定義類(lèi)MyGlideEngine邓线,仿照類(lèi) GlideEngine淌友,重新實(shí)現(xiàn) ImageEngine煌恢,具體實(shí)現(xiàn)如下(注:該類(lèi)未進(jìn)行封裝,代碼不優(yōu)雅震庭,各位可根據(jù)自己業(yè)務(wù)需求瑰抵,進(jìn)行相應(yīng)的修改優(yōu)化)
public class MyGlideEngine implements ImageEngine {
@Override
public void loadThumbnail(Context context, int resize, Drawable placeholder, ImageView imageView, Uri uri) {
RequestOptions options = new RequestOptions()
.centerCrop()
.placeholder(placeholder)//這里可自己添加占位圖
.error(R.drawable.error)//這里可自己添加出錯(cuò)圖
.override(resize, resize);
Glide.with(context)
.asBitmap() // some .jpeg files are actually gif
.load(uri)
.apply(options)
.into(imageView);
}
@Override
public void loadGifThumbnail(Context context, int resize, Drawable placeholder, ImageView imageView,
Uri uri) {
RequestOptions options = new RequestOptions()
.centerCrop()
.placeholder(placeholder)//這里可自己添加占位圖
.error(R.drawable.error)//這里可自己添加出錯(cuò)圖
.override(resize, resize);
Glide.with(context)
.asBitmap()
.load(uri)
.apply(options)
.into(imageView);
}
@Override
public void loadImage(Context context, int resizeX, int resizeY, ImageView imageView, Uri uri) {
RequestOptions options = new RequestOptions()
.centerCrop()
.override(resizeX, resizeY)
.priority(Priority.HIGH);
Glide.with(context)
.load(uri)
.apply(options)
.into(imageView);
}
@Override
public void loadGifImage(Context context, int resizeX, int resizeY, ImageView imageView, Uri uri) {
RequestOptions options = new RequestOptions()
.centerCrop()
.override(resizeX, resizeY)
.priority(Priority.HIGH);
Glide.with(context)
.asGif()
.load(uri)
.apply(options)
.into(imageView);
}
@Override
public boolean supportAnimatedGif() {
return true;
}
}
自定義類(lèi)寫(xiě)好后,將 .imageEngine(new GlideEngine())
修改成 .imageEngine(new MyGlideEngine ())
器联,然后運(yùn)行項(xiàng)目二汛,查看能否正常使用。
總結(jié)
- 由于 Matisse 很久未更新維護(hù)拨拓,所以在 Glide 升級(jí)后肴颊,會(huì)出現(xiàn)這種問(wèn)題。希望 Matisse 貢獻(xiàn)者在接下來(lái)的維護(hù)中渣磷,修復(fù)這個(gè)問(wèn)題婿着。
- 本方案在我目前的項(xiàng)目中可正常使用,如果各位沒(méi)有解決問(wèn)題幸海,還請(qǐng)勿噴祟身。