Glide加载圆形图片报错:java.lang.AbstractMethodError: abstract method "void com.bumptech.glide.load.Key.updat
来源:互联网 发布:快捷支付软件 编辑:程序博客网 时间:2024/06/05 05:58
Glide是Google公司在2014年的I/O大会上发布的,到现在有3年左右了,最先版本已经到了4.0以上了。而现在Android上的图片加载框架非常成熟,从最早的老牌图片加载框架UniversalImageLoader,到后来Google推出的Volley,再到后来的新兴军Glide和Picasso,当然还有Facebook的Fresco。而Glide是目前谷歌公司推荐的图片加载工具,好,那我们就现在来了解下Glide。
Glide基本用法
使用前,先添加依赖
dependencies { compile 'com.github.bumptech.glide:glide:3.5.2' compile 'com.android.support:support-v4:22.0.0'}
对,上面还要添加v4的依赖,Glide需要依赖Support Library v4,别忘了。其实Support Library v4已经是应用程序的标配了,这不是什么问题。
网络加载图片,可别忘了添加网络权限
<uses-permission android:name="android.permission.INTERNET" />
现在先准备张图片:
http://imgsrc.baidu.com/baike/pic/item/d01373f082025aaf520fb3e9f9edab64034f1ad7.jpg
加载图片,一行代码:
String url = "http://imgsrc.baidu.com/baike/pic/item/d01373f082025aaf520fb3e9f9edab64034f1ad7.jpg"; Glide.with(this).load(url).into(imageView);
首先,调用Glide.with()方法用于创建一个加载图片的实例。with()方法可以接收Context、Activity或者Fragment类型的参数。也就是说我们选择的范围非常广,不管是在Activity还是Fragment中调用with()方法,都可以直接传this。那如果调用的地方既不在Activity中也不在Fragment中呢?也没关系,我们可以获取当前应用程序的ApplicationContext,传入到with()方法当中。注意with()方法中传入的实例会决定Glide加载图片的生命周期,如果传入的是Activity或者Fragment的实例,那么当这个Activity或Fragment被销毁的时候,图片加载也会停止。如果传入的是ApplicationContext,那么只有当应用程序被杀掉的时候,图片加载才会停止。
接下来看一下load()方法,这个方法用于指定待加载的图片资源。Glide支持加载各种各样的图片资源,包括网络图片、本地图片、应用资源、二进制流、Uri对象等等。因此load()方法也有很多个方法重载,除了我们刚才使用的加载一个字符串网址之外,你还可以这样使用load()方法:
// 加载本地图片File file = new File(getExternalCacheDir() + "/image.jpg");Glide.with(this).load(file).into(imageView);// 加载应用资源int resource = R.drawable.image;Glide.with(this).load(resource).into(imageView);// 加载二进制流byte[] image = getImageBytes();Glide.with(this).load(image).into(imageView);// 加载Uri对象Uri imageUri = getImageUri();Glide.with(this).load(imageUri).into(imageView);
当然Glide还有其他一些常用的方法,比如:
Glide.with(this) .load(url) .asBitmap()//以图片的形式展示,还有asGif()方法,加载gif图片 .placeholder(R.drawable.loading)//占位图 .error(R.drawable.error)//加载出错时的图片 .override(100, 100)//指定设置图片大小 .diskCacheStrategy(DiskCacheStrategy.NONE)//缓存策略 .into(imageView);
其中需要注意的是asBitmap()
方法,这个方法的意思就是说这里只允许加载静态图片,不需要Glide去帮我们自动进行图片格式的判断了。其他图片加载设置项方法,可以通过RequestOptions类去进行设置。
设置监听器
Glide.with(this).load(internetUrl).listener(new RequestListener<String, GlideDrawable>() { @Override public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) { return false; } //这个用于监听图片是否加载完成 @Override public boolean onResourceReady(GlideDrawable resource String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) { return false; } }).into(imageView);
缓存策略
//Glide支持多种磁盘缓存策略:DiskCacheStrategy.NONE :不缓存图片 DiskCacheStrategy.SOURCE :缓存图片源文件 DiskCacheStrategy.RESULT:缓存修改过的图片 DiskCacheStrategy.ALL:缓存所有的图片,默认//清理缓存Glide.get(context).clearDiskCache();
好了,上面的基础先到这里了。
下面是本文的重点,是我在使用中报的一个错,就是在使用加载圆形图的时候的出错。这里说下,加载圆形图的时候,有2个选择,一个是自定义写的,一个是利用老外封装的一个依赖包,但是这个依赖包现在报的就是这个错。先说说是如何使用的吧。
1. 添加依赖
// Glide图形转换工具 compile 'jp.wasabeef:glide-transformations:2.0.1'
2.使用
// 使用构造方法 CropCircleTransformation(Context context) Glide.with(this) .load(url) .bitmapTransform(new CropCircleTransformation(this)) .into(mImageView2);
听从网上的一些建议,用上面的依赖库,使用时出错了。这时候就会报出下面的错:
java.lang.AbstractMethodError: abstract method "void com.bumptech.glide.load.Key.updateDiskCacheKey(java.security.MessageDigest)"
需要在里面实现一个抽象方法,但是目前因为是依赖包,你无法进行修改源码,所以那有两种方式,一是下载源码,重新编写,一种是自己写个处理方法。
下面的这个处理方法,经过测试,可行。
/**** des: 将图片转化为圆形*/public class GlideCircleTransform extends BitmapTransformation { public GlideCircleTransform(Context context) { super(context); } @Override protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) { return circleCrop(pool, toTransform); } private static Bitmap circleCrop(BitmapPool pool, Bitmap source) { if (source == null) return null; int size = Math.min(source.getWidth(), source.getHeight()); int x = (source.getWidth() - size) / 2; int y = (source.getHeight() - size) / 2; // TODO this could be acquired from the pool too Bitmap squared = Bitmap.createBitmap(source, x, y, size, size); Bitmap result = pool.get(size, size, Bitmap.Config.ARGB_8888); if (result == null) { result = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888); } Canvas canvas = new Canvas(result); Paint paint = new Paint(); paint.setShader(new BitmapShader(squared, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP)); paint.setAntiAlias(true); float r = size / 2f; canvas.drawCircle(r, r, r, paint); return result; } @Override public String getId() { return getClass().getName(); }}
使用
Glide.with(this).glideRequet.load(url).transform(new GlideCircleTransform(context)).into(imageView);
- Glide加载圆形图片报错:java.lang.AbstractMethodError: abstract method "void com.bumptech.glide.load.Key.updat
- 集成Glide4.3.1出错!AbstractMethodError: abstract method "void com.bumptech.glide.module
- Matisse 与 Glide -- java.lang.NoSuchMethodError: com.bumptech.glide.RequestManager.load
- Glide加载圆形图片
- Glide加载圆形图片
- Glide加载圆形图片
- Glide 圆形加载图片
- java.lang.ClassCastException: com.bumptech.glide.request.target.SquaringDrawable cannot be cast to a
- Glide圆形图片加载封装
- Glide圆形图片的加载
- Glide 图片加载 java.lang.IllegalArgumentException
- Glide 加载圆角、圆形图片
- Glide 加载圆角或圆形图片
- glide加载圆形图片待边框
- Glide加载圆角、圆形图片
- Glide加载圆形,圆角图片
- Glide加载圆形图片的处理
- glide记载圆形图片
- 支持向量机通俗导论(理解SVM的三层境界)
- flash笔记
- Python快速入门(2)-函数的魔法
- HTML <div> 标签的 align 属性
- 在Apache下开启SSI配置
- Glide加载圆形图片报错:java.lang.AbstractMethodError: abstract method "void com.bumptech.glide.load.Key.updat
- TCP/IP基础
- D 03_JavaScript中的BOM对象
- eclipse常用快捷键
- Java基础教程26-final关键字
- Message Decoding UVA
- Windows启动过程详解
- 欢迎使用CSDN-markdown编辑器
- 牛客网专项练习----算法