glide有IllegalArgumentException("Wrapped transformation unexpectedly returned a non BitmapDrawable resource: "+ resource.get())报错是怎么回事
问题原因
出现IllegalArgumentException("Wrapped transformation unexpectedly returned a non BitmapDrawable resource: "+ resource.get())的原因是在Glide图像加载库中,在使用自定义的Transformation时,如果该Transformation返回的资源不是BitmapDrawable类型,就会触发该异常。这是因为Glide默认期望Transformation返回的资源是BitmapDrawable类型,但实际上返回了其他类型的资源导致异常抛出。
解决方案
在遇到 Glide 出现 IllegalArgumentException("Wrapped transformation unexpectedly returned a non BitmapDrawable resource: "+ resource.get()) 异常时,通常是因为 Glide 的图片转换流程中,某个自定义转换器返回了一个非 BitmapDrawable 类型的资源,而 Glide 期望得到的是 BitmapDrawable 类型的资源。这可能是由于自定义转换器的转换逻辑问题导致的。 要解决这个问题,可以按照以下步骤进行: 1. 检查自定义的 Glide 转换器的代码,确保在转换过程中返回的资源是 BitmapDrawable 类型。如果资源不是 BitmapDrawable 类型,需要修改转换器的逻辑,确保最终返回的资源是 BitmapDrawable 类型。 2. 如果你无法修改自定义转换器的逻辑,可以考虑使用 Glide 的 skipMemoryCache() 方法来禁用内存缓存,从而跳过转换过程中的缓存。这样可以避免出现转换后的非 BitmapDrawable 资源导致的问题。 下面是一个简单的示例代码,展示了如何正确使用 skipMemoryCache() 方法来解决这个问题:
GlideApp.with(context)
.load(imageUrl)
.skipMemoryCache(true) // 禁用内存缓存来避免转换问题
.into(imageView);
通过禁用内存缓存,可以确保每次都重新加载图片并跳过转换过程中的缓存,从而避免出现 IllegalArgumentException 异常。
具体例子
IllegalArgumentException("Wrapped transformation unexpectedly returned a non BitmapDrawable resource: "+ resource.get())"这个问题通常是由于Glide加载图片时应用了一个转换操作(Transformation),但是该转换操作返回了一个非BitmapDrawable类型的资源,导致了异常的抛出。要解决这个问题,需要确保应用的转换操作返回的是BitmapDrawable类型的资源。 正确使用Glide时,需要注意以下几点: 1. 在应用转换操作时,确保转换后的资源类型与Glide可以处理的类型兼容; 2. 避免在转换操作中返回不支持的资源类型。 以下是一个正确使用Glide并避免出现IllegalArgumentException异常的例子:
// 导入Glide库
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.resource.bitmap.BitmapTransformation;
import com.bumptech.glide.load.resource.drawable.GlideDrawable;
import com.bumptech.glide.request.RequestListener;
import com.bumptech.glide.request.RequestOptions;
// 使用Glide加载图片并应用转换操作
Glide.with(context)
.load(imageUrl)
.apply(RequestOptions.bitmapTransform(new BitmapTransformation() {
@Override
protected Bitmap transform(@NonNull BitmapPool pool, @NonNull Bitmap toTransform, int outWidth, int outHeight) {
// 在这里进行图片转换操作
// 确保返回的是Bitmap类型的资源
Bitmap transformedBitmap = ...; // 进行转换操作
return transformedBitmap;
}
@Override
public void updateDiskCacheKey(@NonNull MessageDigest messageDigest) {
// 更新缓存键
}
})
.listener(new RequestListener() {
@Override
public boolean onException(Exception e, Object model, Target target, boolean isFirstResource) {
return false;
}
@Override
public boolean onResourceReady(GlideDrawable resource, Object model, Target target, boolean isFromMemoryCache, boolean isFirstResource) {
return false;
}
})
.into(imageView);
在以上示例中,通过使用RequestOptions.bitmapTransform()
方法应用了一个BitmapTransformation,并确保在transform()
方法中返回的是Bitmap类型的资源,避免了出现IllegalArgumentException异常。同时,使用了RequestListener
来处理加载过程中的异常情况。
通过以上措施,可以确保在使用Glide加载图片并应用转换操作时不会出现IllegalArgumentException异常。