'How to use RecyclerView with Multi-Threading

I need to create an application that displays gallery photos in a RecyclerView, and to retrieve the URI of the photo I use an AsyncTask.

The problem is that no photos are shown in the application, even if the URI is successfully retrieved.

AsyncTask code:

public class GetPhotoUriTask extends AsyncTask<Integer, Float, Uri>
{
//    private final WeakReference<Cursor> cursorWeakReference;
//    private final WeakReference<ImageView> imageViewWeakReference;

    private final Cursor cursor;
    private final ImageView imageView;

    public GetPhotoUriTask(Cursor cursor, ImageView imageView)
    {
//        cursorWeakReference = new WeakReference<>(cursor);
//        imageViewWeakReference = new WeakReference<>(imageView);
        this.cursor = cursor;
        this.imageView = imageView;
    }

    @Override
    protected Uri doInBackground(Integer... position)
    {
//        Cursor cursor = cursorWeakReference.get();
        return getPhotoUri(cursor, position[0].intValue());
    }

    private Uri getPhotoUri(Cursor cursor, int position)
    {
        cursor.moveToPosition(position);
        int photoId = cursor.getInt(0);
        Uri photoUri = Uri.withAppendedPath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "" + photoId);

        return photoUri;
    }

    @Override
    protected void onPostExecute(Uri photoUri)
    {
//        ImageView imageView = imageViewWeakReference.get();
        imageView.setImageURI(photoUri);
    }
}

RecyclerView code:

public class GalleryAdapter extends RecyclerView.Adapter<GalleryAdapter.GalleryViewHolder>
{
    public class GalleryViewHolder extends RecyclerView.ViewHolder
    {
        private ImageView photoGallery;

        public GalleryViewHolder(@NonNull View itemView) {
            super(itemView);

            photoGallery = itemView.findViewById(R.id.photoGallery);
        }
    }

    private Cursor cursor;

    public GalleryAdapter(Cursor cursor)
    {
        this.cursor = cursor;
    }

    @NonNull
    @Override
    public GalleryViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType)
    {
        View image = LayoutInflater.from(parent.getContext()).inflate(R.layout.image_rv, parent, false);

        return new GalleryViewHolder(image);
    }

    @Override
    public void onBindViewHolder(@NonNull GalleryViewHolder holder, int position)
    {
        GetPhotoUriTask getPhotoUriTask = new GetPhotoUriTask(cursor, holder.photoGallery);
        getPhotoUriTask.execute(Integer.valueOf(position));
    }

    @Override
    public int getItemCount()
    {
        return cursor.getCount();
    }
}


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source