picasso:如何取消适配器中的所有图像请求

时间:2014-07-22 20:42:34

标签: android picasso

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

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

3 个答案:

答案 0 :(得分:27)

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

定义一个提供清理方法的<ol type="I"> <li>Elemento primero <ol type="I"> <li>Subelemento primero</li> <li>Subelemento segundo</li> </ol> </li> <li>elemento segundo</li> </ol> <ol type="I"> <li>Subelemento primero</li> <li>Subelemento segundo</li> </ol>

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()

当您的片段视图被销毁时(或者您希望的时候)取消Picasso请求:

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将被回收。

答案 1 :(得分:1)

  

但是只有你不在列表/网格适配器中!请求图像   对于相同的imageview / target(例如,在适配器getView中)将会这样做   这是自动的。你应该只需要取消(而且你不需要   实际需要)如果您正在提出请求然后离开   屏幕。

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

答案 2 :(得分:1)

您还可以对您的片段/活动发出的请求使用RequestCreator#tag(Object),然后使用Picasso#cancelTag(Object)取消所有请求。