詳解Matisse與Glide--java.lang.NoSuchMethodError:com.bumptech.glide.RequestManager.load
問(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)在類 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)題的解決方式。
1.簡(jiǎn)單粗暴型的解決方式,將代碼中的.imageEngine(new GlideEngine()) 替換成 .imageEngine(new PicassoEngine())(注:需要 Picasso 依賴)
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);
2.自定義類MyGlideEngine,仿照類 GlideEngine,重新實(shí)現(xiàn) ImageEngine,具體實(shí)現(xiàn)如下(注:該類未進(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;
}
}
自定義類寫好后,將 .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)勿噴。
到此這篇關(guān)于詳解Matisse與Glide--java.lang.NoSuchMethodError:com.bumptech.glide.RequestManager.load的文章就介紹到這了,更多相關(guān)詳解Matisse與Glide內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java AbstractMethodError原因案例詳解
- Java異常 Factory method''sqlSessionFactory''rew exception;ested exception is java.lang.NoSuchMethodError:
- 解決啟動(dòng)Azkaban報(bào)錯(cuò)問(wèn)題:java.lang.NoSuchMethodError: com.google.common.collect.ImmutableMap.toImmutableMap
- 解決 java.lang.NoSuchMethodError的錯(cuò)誤
- java.lang.AbstractMethodError: org.apache.xerces.dom.DocumentImpl.setXmlVersion問(wèn)題解決方法
- Java AbstractMethodError案例分析詳解
相關(guān)文章
Android Viewpager實(shí)現(xiàn)輪播廣告圖
這篇文章主要為大家詳細(xì)介紹了Android Viewpager實(shí)現(xiàn)輪播廣告圖,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05
Android開(kāi)發(fā)中CheckBox的簡(jiǎn)單用法示例
這篇文章主要介紹了Android開(kāi)發(fā)中CheckBox的簡(jiǎn)單用法,結(jié)合實(shí)例形式分析了Android中CheckBox控件的基本功能設(shè)置與頁(yè)面布局技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2016-07-07
Android通過(guò)Handler與AsyncTask兩種方式動(dòng)態(tài)更新ListView(附源碼)
這篇文章主要介紹了Android通過(guò)Handler與AsyncTask兩種方式動(dòng)態(tài)更新ListView的方法,結(jié)合實(shí)例形式分析了ListView動(dòng)態(tài)更新的常用技巧,并附上完整實(shí)例源碼供讀者下載,需要的朋友可以參考下2015-12-12
詳解基于Android App 安全登錄認(rèn)證解決方案
這篇文章主要介紹了基于Android App 安全登錄認(rèn)證解決方案,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-09-09
Android利用繪制緩沖實(shí)現(xiàn)代碼雨效果
看過(guò)很多代碼雨的前端實(shí)現(xiàn),卻很少看到過(guò)Android代碼雨效果的實(shí)現(xiàn),當(dāng)然 open gl es的實(shí)現(xiàn)是有的,一個(gè)主要的原因是,在Android Canvas繪制時(shí),很少有人考慮使用繪制緩沖,所以本文將給大家介紹Android如何利用繪制緩沖實(shí)現(xiàn)代碼雨效果,需要的朋友可以參考下2024-03-03
Android自定義View實(shí)現(xiàn)仿網(wǎng)易音樂(lè)唱片播放效果
這篇文章主要為大家詳細(xì)介紹了Android自定義View實(shí)現(xiàn)仿網(wǎng)易音樂(lè)唱片播放效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04
Android編程之SurfaceView實(shí)例詳解
這篇文章主要介紹了Android編程之SurfaceView用法,簡(jiǎn)要分析了View和SurfaceView的區(qū)別,并結(jié)合實(shí)例形式分析了SurfaceView的具體使用步驟與相關(guān)技巧,需要的朋友可以參考下2016-02-02
android如何默認(rèn)打開(kāi)小區(qū)廣播具體實(shí)現(xiàn)
小區(qū)廣播的開(kāi)關(guān),1是打開(kāi),0是關(guān)閉;0x00就默認(rèn)關(guān)閉,改成0x01就是默認(rèn)打開(kāi),具體修改如下,感興趣的朋友可以參考下哈2013-06-06
Android編程實(shí)現(xiàn)檢測(cè)當(dāng)前電源狀態(tài)的方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)檢測(cè)當(dāng)前電源狀態(tài)的方法,涉及Android針對(duì)當(dāng)前電源的電量、容量、伏數(shù)、溫度等的檢測(cè)技巧,非常簡(jiǎn)單實(shí)用,需要的朋友可以參考下2015-11-11
android判斷手機(jī)是否安裝地圖應(yīng)用實(shí)現(xiàn)跳轉(zhuǎn)到該地圖應(yīng)用
這篇文章主要給大家介紹了android如何判斷手機(jī)是否安裝地圖應(yīng)用,并實(shí)現(xiàn)跳轉(zhuǎn)到該地圖應(yīng)用的方法,需要的朋友可以參考借鑒,下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-01-01

