picasso: how to cancel all image requests made in an adapter

terry picture terry · Jul 22, 2014 · Viewed 8.9k times · Source

as usual we use an adapter to populate a listView. in the adapter we use picasso to load the images. i see that as rows are recycled when loading an image into an target (imageView) picasso will automatically cancel requests for that target.

how does one cancel all of the outstanding requests when leaving the fragment or activity?

Answer

sfera picture sfera · Nov 27, 2015

This answer may come a bit late, but maybe someone still needs it...

Define a ViewHolder which provides a cleanup method:

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);
    }
}

Implement onViewRecycled() in your adapter:

static class ImageAdapter extends RecyclerView.Adapter<ImageHolder> {

    // ...

    @Override
    public void onViewRecycled(final ImageHolder holder) {
        holder.cleanup();
    }
}

Cancel the Picasso requests when your Fragment's view is destroyed (or whenever you wish):

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) will detach all currently added Views and their associated ViewHolders will be recycled.