您的位置:

glide有IllegalArgumentException("Wrapped transformation unexpectedly returned a non BitmapDrawable resource: "+ resource.get())报错是怎么回事

  发布时间:2025-03-14 11:34:19
该文章介绍了在使用Glide图像加载库时可能出现的IllegalArgumentException异常的原因和解决方案。异常通常是由于自定义转换器返回了非BitmapDrawable类型的资源导致,解决方法包括检查和修改转换器逻辑以确保返回BitmapDrawable类型资源,或者禁用内存缓存以避免转换过程中的缓存。文章还给出了具体示例代码展示正确使用Glide并避免异常的方法。

问题原因

出现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异常。