Matisse 与 Glide -- java.lang.NoSuchMethodError: com.bumptech.glide.RequestManager.load
来源:互联网 发布:android 网络请求mvp 编辑:程序博客网 时间:2024/06/05 02:43
原文地址
http://www.jianshu.com/p/220a7e5ce321
问题描述
- 在使用 Matisse 与 glide 4.0.0 以及 4.0.0 之后的版本过程中,发现通过
Matisse 的 wiki 代码调用选取图片的方式后,会出现本文标题的错误
1.以下为 wiki 调用代码:
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.以下为控制台报出的错误信息,内容过多,我就只截取了错误标题部分
java.lang.NoSuchMethodError: com.bumptech.glide.RequestManager.loadat 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)
问题定位
- 通过报错信息,可以发现出现错误的调用路径,根据路径依次查看,发现在类 GlideEngine.java中,出现如下代码:
@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); }
其中,有一行显示为红色,也就是说,该行代码出现错误,导致程序的崩溃。
.asBitmap()
问题分析
- 在问题定位中,发现 Matisse 在通过 Glide 调用相关 api 的时候出现错误,因此,问题主要原因出现在 Glide 的使用上。通过查看 Glide 的 相关文档,发现 Glide 从 v3 到 v4 做了一些改动。
- 在 相关文档 中发现
Glide.with(fragment) .asBitmap() .apply(myOptions) .load(url) .into(bitmapView);
仔细看这里的内容,这里 .asBitmap()
的调用是在 .load(url)
之前,而我们在 问题定位 中的代码, .asBitmap()
的调用是在 .load(url)
之后。随后我在测试中,调换了两者的位置,发现 .asBitmap()
在 .load(url)
之前调用没有问题,而在 .load(url)
之后调用,的确出现了本文所描述的问题。
问题解决
到此,问题的原因已经很明确了。下面来谈谈问题的解决方式。
- 简单粗暴型的解决方式,将代码中的
.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);
- 自定义类MyGlideEngine,仿照类 GlideEngine,重新实现 ImageEngine,具体实现如下(注:该类未进行封装,代码不优雅,各位可根据自己业务需求,进行相应的修改优化)
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)//这里可自己添加出错图 .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)//这里可自己添加出错图 .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 ())
,然后运行项目,查看能否正常使用。
总结
- 由于 Matisse 很久未更新维护,所以在 Glide 升级后,会出现这种问题。希望 Matisse 贡献者在接下来的维护中,修复这个问题。
- 本方案在我目前的项目中可正常使用,如果各位没有解决问题,还请勿喷。
阅读全文
0 0
- Matisse 与 Glide -- java.lang.NoSuchMethodError: com.bumptech.glide.RequestManager.load
- Glide加载圆形图片报错:java.lang.AbstractMethodError: abstract method "void com.bumptech.glide.load.Key.updat
- java.lang.ClassCastException: com.bumptech.glide.request.target.SquaringDrawable cannot be cast to a
- Android Glide Error:Failed to resolve: com.github.bumptech.glide:glide:+ 问题解决
- 如何解决failed to resolve:com.github.bumptech.glide:glide:3.7.0
- Error:(30, 13) Failed to resolve: com.github.bumptech.glide:glide:3.7.0
- 集成Glide4.3.1出错!AbstractMethodError: abstract method "void com.bumptech.glide.module
- 【一】Glide错误java.lang.IllegalArgumentException: You cannot start a load for a destroyed activity
- Glide错误java.lang.IllegalArgumentException: You cannot start a load for a destr
- Glide错误java.lang.IllegalArgumentException: You cannot start a load for a destroyed activity
- Glide错误java.lang.IllegalArgumentException: You cannot start a load for a destroyed activity
- Glide错误java.lang.IllegalArgumentException: You cannot start a load for a destroyed activity
- Glide 图片加载 java.lang.IllegalArgumentException
- glide
- Glide
- Glide
- glide
- Glide
- POJ1201 Intervals
- Centos7安装并配置mysql5.6完美教程
- App图标不显示:Xcode项目在Xcode9中运行会出现AppIcon不显示的 BUG
- 第一篇
- AndroidStudio 版本管理设置忽略文件
- Matisse 与 Glide -- java.lang.NoSuchMethodError: com.bumptech.glide.RequestManager.load
- WEB安全测试的类型
- Robot in Maze----BFS
- Netsh命令详解与使用方法
- 经典cnn检测网络
- log4j2的一个实例
- Ubuntu16.04.3安装Docker,配置镜像加速器及其基本使用
- 关于linux下的core
- Docker网络解决方案