我正在尝试创建一个由每个单元格中的 ImageView 填充的 RecyclerView,并且每个图像对应于 Firebase 存储中的图像。
我有一个传递到 RecyclerView 适配器中的字符串列表,每个字符串代表 Firebase 存储中图像的 URL。我将每个图像加载到 onBindViewHolder()
中。
我得到的返回是加载一些图像的速度非常慢(大约 5 张图片),然后大约需要 4 分钟才能加载另外 5 张图像,并且在这些图像之后似乎永远不会加载任何其他图像。
我在 StackOverflow 上阅读了多篇文章,但其中大多数只是告诉您使用 fitCenter()
或 centerCrop()
但这不会改变我的任何内容案件。我还在 Glide 的文档中读到,Glide 会自动对图像进行下采样,因此我不需要手动执行此操作,对吧?有什么想法我可能在这里做错了吗?已成功从 Firebase 检索网址字符串,并且查询几乎立即得到解决,因此我认为那里不存在任何问题。
更新:
我在 onBindViewHolder()
方法中进行了一些修改,以便显式请求从 Glide 缓存图像,并且我还使用 thumbnail API
下载较低分辨率的图像图片。现在正在加载更多图像,但每张图像仍需要大约 7 秒才能加载,这显然太长了。如果您有任何建议,请告诉我。
以下是在我的主要 Activity 中设置 RecyclerView 的方式:
iconsRCV = findViewById(R.id.cardIconsRCV)
iconsRCV.layoutManager = GridLayoutManager(this,5) // set the layout manager for the rcv
val iconUrls : ArrayList<String> = ArrayList() // initialize the data with an empty array list
val adapter = CardIconAdapter(this,iconUrls) // initialize the adapter for the recyclerview
iconsRCV.adapter = adapter // set the adapter
请注意,当某些查询完成时,我会获取新数据,然后调用 adapter.notifyDataSetChanged()
将新数据传递到 RecyclerView。
CardIconAdapter.java:
public class CardIconAdapter extends RecyclerView.Adapter<CardIconAdapter.ViewHolder> {
private RequestOptions requestOptions = RequestOptions.diskCacheStrategyOf(DiskCacheStrategy.ALL).centerCrop().error(R.drawable.applogotmp);
private List<String> urlsList;
private Context context;
class ViewHolder extends RecyclerView.ViewHolder {
ImageView iconImg;
ViewHolder(@NonNull View view) {
super(view);
iconImg = view.findViewById(R.id.cardIcon);
}
}
public CardIconAdapter(Context cntxt, List<String> data) {
context = cntxt;
urlsList = data;
}
@NonNull
@Override
public CardIconAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_icons_rcv_item,parent,false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull CardIconAdapter.ViewHolder holder, int position) {
GlideApp.with(context).load(urlsList.get(position)).apply(requestOptions).into(holder.iconImg);
}
@Override
public int getItemCount() {
return urlsList.size();
}
}
附注Firebase 中的图片大小大多在 200KB 以下,但也有少数达到 4MB。此外,R.layout.card_icons_rcv_item
布局中的 ImageView 大小为 75x75。
最佳答案
希望您使用了最新版本的 glide。 有几种方法可以更好地加载和缓存图像, 这归功于这个美好的article .
<强>1。启用磁盘缓存
val requestOptions = RequestOptions().diskCacheStrategy(DiskCacheStrategy.ALL)
Glide.with(context).load(url).apply(requestOptions).into(imageView)
<强>2。列表项
val requestOptions = RequestOptions()
.diskCacheStrategy(DiskCacheStrategy.ALL)
.signature(ObjectKey(signature))
Glide.with(context).load(url).apply(requestOptions).into(imageView)
<强>3。覆盖图像大小(可选)
val requestOptions = RequestOptions()
.diskCacheStrategy(DiskCacheStrategy.ALL)
.signature(ObjectKey(signature))
.override(100, 100) // resize does not respect aspect ratio
Glide.with(context).load(url).apply(requestOptions).into(imageView)
<强>4。添加缩略图网址
// With thumbnail url
Glide.with(context).load(url)
.thumbnail(Glide.with(context).load(thumbUrl))
.apply(requestOptions).into(imageView)
// Without thumbnail url
// If you know thumbnail size
Glide.with(context).load(url)
.thumbnail(Glide.with(context).load(url).apply(RequestOptions().override(thumbSize)))
.apply(requestOptions).into(imageView)
// With size multiplier
Glide.with(context).load(url)
.thumbnail(0.25f)
.apply(requestOptions).into(imageView)
<强>5。设置每月清洁计划
// This method must be called on the main thread.
Glide.get(context).clearMemory()
Thread(Runnable {
// This method must be called on a background thread.
Glide.get(context).clearDiskCache()
}).start()
<强>6。转换位图
// TODO remove after transformation is done
.diskCacheStrategy(SOURCE) // override default RESULT cache and apply transform always
.skipMemoryCache(true) // do not reuse the transformed result while running
.diskCacheStrategy(DiskCacheStrategy.ALL) // It will cache your image after loaded for first time
.format(DecodeFormat.PREFER_ARGB_8888) //for better image quality
.dontTransform() // to load image faster just skip transform
.placeholder(R.drawable.placeholder) // use place holder while image is being load
关于java - Glide 使用 URL 从 firebase 加载图像速度非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58973780/