所以我使用回收器 View 在网格中显示图像,并使用 volley 库从 url 下载图像作为位图。
public void onBindViewHolder(final TrendingAdapter.ViewHolder viewHolder, int i) {
ImageRequest request = new ImageRequest(url, new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap bitmap) {
if (bitmap != null) {
viewHolder.getmImageView().setImageBitmap(bitmap);
}
}
}, 0, 0, null,
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
}
});
AppController.getInstance().addToRequestQueue(request);
}
问题是当我在下载图像之前滚动并跳过一个或多个 View 并且该 View 被回收时,图像下载请求不会在那些中间 View 上取消,导致那个/那些图像在实际图像加载到该 View 中。
所以我考虑使用标签取消那些中间图像请求,但不知道如何取消其他并行 View 中的请求!
此外,当我使用 volley NetworkImageView(它自己处理此类图像取消)时,也会给出完美的结果。但是我需要获取每个图像的位图以从中选择颜色,所以我不能使用 NetworkImageView。
问)如何在使用 recyclerview 膨胀的特定 ImageView 上取消所有待处理的 volley 图像请求(除了应该加载且不影响其他平行 View 的图像请求)?
最佳答案
您应该使用 ImageLoader
类,而不是直接向 RequestQueue
添加请求。这样,用于获取图像的 get()
方法将返回类型为 ImageContainer
的对象。
将这个ImageContainer
保存在ViewHolder
中,当 View 被回收时,只需调用回收图像上的cancelRequest()
方法即可如果尚未执行,则取消请求。
看看 NetworkImageView
的代码。它以类似的方式工作。
关于android - Recycler view with volley 图像请求(取消请求),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26591390/