首页 > 解决方案 > Android Glide - 无法回收已回收的资源

问题描述

我有一个用户可以在运行时创建和删除的对象列表,每个对象都分配有一个图标。当我在某些时候对这些对象执行多个添加/删除操作时,会出现以下异常。

java.lang.IllegalStateException: Cannot recycle a resource that has already been recycled
at com.bumptech.glide.load.engine.EngineResource.recycle(EngineResource.java:71)
at com.bumptech.glide.load.engine.ResourceRecycler$ResourceRecyclerCallback.handleMessage(ResourceRecycler.java:37)
at android.os.Handler.dispatchMessage(Handler.java:98)
at android.os.Looper.loop(Looper.java:135)

我自己不执行任何回收操作,也不对 Glide 位图池进行任何调用。我的自定义 Glide 模型是以下类

public class MyGlideInput {

    private String packageName, apkFilePath, iconResName;

    public MyGlideInput() {
    }

    @Override
    public boolean equals(@Nullable Object obj) {
        if(obj == null){
            return false;
        }
        if(!(obj instanceof MyGlideInput)){
            return false;
        }
        MyGlideInput input = (MyGlideInput) obj;
        return stringsEqual(packageName, input.packageName ) && stringsEqual(apkFilePath, input.apkFilePath)
                && stringsEqual(iconResName, input.iconResName);
    }

    @Override
    public int hashCode() {
        return (apkFilePath+packageName+iconResName+"").hashCode();
    }

    public boolean stringsEqual(String a, String b){
        return a != null && a.equals(b);
    }

}

在 bindViewHolder 中的 RecyclerView 适配器类上,我这样做:

GlideInput glideInput = new GlideInput().setDrawableResName(iconResName);
GlideApp.with(img).load(glideInput).dontAnimate().error(R.drawable.warning).into(img);

有什么建议么?

标签: androidandroid-glideillegalstateexceptionrecycle

解决方案


从我到目前为止所看到的情况来看,这个错误的出现主要是因为你有任何转换。我在转换方法中进行了一些回收,即使它声明开发人员不应该在他们的自定义转换中自己做。另外,你应该非常小心RecycleView

您能否为我们提供更多代码,例如您使用的一些转换或任何您认为它会产生不良影响的东西?


推荐阅读