2015-10-27 85 views
17

我刚刚开始从Universal Image Loader移动到Glide。但是,在recyclerview中滚动再次滚动时,我会收到大量警告消息。在Recyclerview中使用Glide的警告

W/Bitmap: Called reconfigure on a bitmap that is in use! This may cause graphical corruption! 

如果我换出Glide作为另一个图像加载库,警告消失。代码在bindViewHolder与图像有关的:

Glide.with(viewHolder.imageView.getContext()) 
      .load(DisplayImageUtil.getImageUrl(item.getImageUrl(), 600)) 
      .diskCacheStrategy(DiskCacheStrategy.ALL) 
      .into(viewHolder.imageView); 

测试在Nexus 5.

+0

Android M上发生这种情况吗? https://github.com/bumptech/glide/issues/743 – TWiStErRob

回答

0

此讨论here

通常这是滥用位图的结果,方式是通过返回 位图多次访问池而没有获得中间值,或者在调用对应的 目标上的clear()之后引用位图。如果你有自定义转换,这是一个很好的地方 仔细看看,以确保你没有返回一个位图到池 两次。您可以在wiki上看到更多关于此问题的信息: https://github.com/bumptech/glide/wiki/Resource-re-use-in-Glide

您看到的日志来自catch块(捕获异常)。请确保您有:

  • 不尝试加载2位图一个目标视图
  • 不清除的资源再利用的目标的看法,但抱着一种资源,因为你正在使用recyclerView参考

,可能第二点是真实的,即回收视图,同时坚持所有位图引用

+0

我不确定我完全理解这个问题。我没有做任何自定义回收,我只从RecyclerView的bindViewHolder中加载图像。当我向上滚动时会出现问题,并且图像再次加载。这是我必须用Glide手动处理的东西吗?之前只使用过UIL,并没有遇到这样的问题。 – Bendik

+0

@凯,你指的是“catch block”?我发现这是来自本地[Bitmap.cpp]的警告(https://github.com/android/platform_frameworks_base/blob/marshmallow-release/core/jni/android/graphics/Bitmap.cpp#L256)。 – TWiStErRob

+3

此答案不正确,引用引用IllegalArgumentException,而不是此处的警告。原始问题中的警告将在正常使用Glide期间发生,并且不是滥用位图的结果。 –

1

我在Android M(Nexus 5x)上首次运行我的应用后遇到同样的问题。

编辑:在Glide Github上打开问题 - https://github.com/bumptech/glide/issues/743后,我发现我的原始“解决方案”没有解决问题,只隐藏了信息。警告来自Android位图,这是因为Glide重用Bitmap以获得更好的性能。

+0

要小心,增加RecyclerView中的项目查看次数可能会导致使用更多的内存。 – TWiStErRob

+0

@TWiStErRob - 你是对的。我宁愿编辑答案,以防止误导某人错误的路径。 – JirkaV

0

尝试在加载图像前调用Glide.clear()。

Glide.clear(viewHolder.imageView); 
Glide.with(viewHolder.imageView.getContext()) 
     .load(DisplayImageUtil.getImageUrl(item.getImageUrl(), 600)) 
     .diskCacheStrategy(DiskCacheStrategy.ALL) 
     .into(viewHolder.imageView); 

希望得到这个帮助。

+3

添加Glide.clear()并没有消除我的问题:( – tieorange

0

我得到了警告和图形损坏。这是在回收站视图的顶部和底部出现剪切位图的形式,如果滚动速度太快,则停留在那里。

将图像视图放在框架布局中已经摆脱了图形损坏。

+0

没有为我工作:/ –

0

您可以使用Android Studio上的Logcat筛选器清理日志。

在Android Logcat过滤器的正则表达式中添加^(?!AbsListView|IInputConnectionWrapper|ApplicationPackageManager|Bitmap|ViewRootImpl)