毕加索:如何取消在适配器中所做的所有图像请求

像往常一样,我们使用一个适配器来填充listView。 在适配器中,我们使用毕加索加载图像。 我发现当将图像加载到目标(imageView)时,行将被回收。毕加索将自动取消该目标的请求。

如何在离开片段或活动时取消所有未完成的请求?

Solutions Collecting From Web of "毕加索:如何取消在适配器中所做的所有图像请求"

这个答案可能会有点晚,但也许有人仍然需要它…

定义一个ViewHolder ,它提供了一个清理方法:

 static class ImageHolder extends RecyclerView.ViewHolder { public final ImageView image; public ImageHolder(final View itemView) { super(itemView); image = (ImageView) itemView.findViewById(R.id.image); } public void cleanup() { Picasso.with(image.getContext()) .cancelRequest(image); image.setImageDrawable(null); } } 

在适配器中实现onViewRecycled()

 static class ImageAdapter extends RecyclerView.Adapter<ImageHolder> { // ... @Override public void onViewRecycled(final ImageHolder holder) { holder.cleanup(); } } 

当你的片段的视图被破坏(或任何你想要的)时,取消毕加索请求:

 public class MyFragment extends Fragment { private RecyclerView recycler; // ... @Override public void onDestroyView() { super.onDestroyView(); recycler.setAdapter(null); // will trigger the recycling in the adapter } } 

RecyclerView.setAdapter(null)将分离所有当前添加的View并且它们相关联的ViewHolder将被回收。

但是,只有当你不在列表/网格适配器! 为相同的图像/目标(例如,在一个适配器getView)请求一个图像将自动做到这一点。 你只需要取消(而你实际上不需要),如果你提出请求,然后离开屏幕。

https://github.com/square/picasso/issues/83

您也可以使用RequestCreator#tag(Object)对您的片段/活动所做的请求,然后使用Picasso#cancelTag(Object)来取消所有这些请求。