'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 |
|---|
