我有一个RecyclerView
,RecyclerView
的每个项目都有ImageView
。我使用ImageView
在Glide
加载图片。我看到一些博客说Glide
可以异步加载图像,但我从下面的代码中看不到这一点。它似乎只在调用onBindViewHolder
时加载一个图像。它是如何显示异步的?
public class GalleryAdapter extends RecyclerView.Adapter<GalleryAdapter.ViewHolder> {
private Context mContext;
private List<GalleryItem> mList;
public GalleryAdapter(Context mContext, List<GalleryItem> mList) {
this.mContext = mContext;
this.mList = mList;
}
public static class ViewHolder extends RecyclerView.ViewHolder {
public ImageView mImageView;
public ViewHolder(View itemView) {
super(itemView);
mImageView = (ImageView) itemView.findViewById(R.id.gallery_item);
}
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.adapter_gallery,
parent, false);
ViewHolder vh = new ViewHolder(v);
return vh;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
GalleryItem item = mList.get(position);
holder.mImageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
Glide.with(mContext)
.load(item.getUrl())
.thumbnail(0.5f)
.into(holder.mImageView);
}
@Override
public int getItemCount() {
return mList.size();
}
public void addAll(List<GalleryItem> newList) {
mList.addAll(newList);
}
public void clear() {
mList.clear();
}
}
答案 0 :(得分:1)
根据滑动文档here和here,您应该使用返回FutureTarget的into()方法,而不是返回Target的方法。此方法采用宽度和高度,而不是ImageView:&#34;如果您确实想要与后台线程上的解码图像进行交互,而不是使用downloadOnly,则可以使用返回FutureTarget的into()版本。&# 34;
答案 1 :(得分:0)
当您将图像加载到 ImageView 时,load 方法会异步工作,请查看以下线程:
在第三个线程中,它提到了如何为要在后台线程中使用的图像进行“同步”加载,这意味着默认情况下它是异步进行的
Bitmap myBitmap = Glide.with(applicationContext)
.load(yourUrl)
.asBitmap()
.centerCrop()
.into(500, 500)
.get()
并且它也说上面的这个调用不能在主线程上完成,但是当他们谈论正常加载到 imageView 时,他们没有提到任何一个,这也是正常加载异步的证据加载后自动将结果移动到主线程以供方法 into(imageView) 使用。
我真的试图明确地找到它,但在文档的任何地方都找不到它,所以我认为这很明显,因为他们没有告诉我们像上面提到的情况那样管理后台线程。