android - 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);
有什么建议么?
解决方案
从我到目前为止所看到的情况来看,这个错误的出现主要是因为你有任何转换。我在转换方法中进行了一些回收,即使它声明开发人员不应该在他们的自定义转换中自己做。另外,你应该非常小心RecycleView
。
您能否为我们提供更多代码,例如您使用的一些转换或任何您认为它会产生不良影响的东西?
推荐阅读
- postgresql - postgresql 两阶段提交准备事务错误:事务不能在 PL/pgSQL 中启动
- javascript - React Native Redux - 将变量传递给调度
- c# - WPF 根据条件切换默认值
- .net-core - 在包参考中使用 * 占位符时,dotnet restore 未更新到新版本
- excel - 如何遍历 Excel 列以读取单元格值以用作我的 PDFmerge 代码工作的文件编号?
- dynamics-crm - 使用相关记录批量更新联系人
- javascript - 除了第一个,如何改变面板的电流?
- go - 确保 net/http 客户端通过 TLS 1.2 连接的传输选项
- c# - 在代理服务下我无法获取客户端 IP
- r - 有谁知道如何修复 Rmarkdown 中的错误 61