java - Glide 使用 URL 从 firebase 加载图像速度非常慢

标签 java android-studio kotlin android-recyclerview android-glide

我正在尝试创建一个由每个单元格中的 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();
}
}

result

附注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/

相关文章:

android - BroadcastReceiver 未从 ACTION_BATTERY_CHANGED 更新

java - 使用 Java 创建 Gradle 自定义插件

java - Netty HTTP 客户端身份验证

java - 验证 Base64 编码的字符串

Android studio 省略断点

android - E/eglCodecCommon : GoldfishAddressSpaceHostMemoryAllocator: ioctl_ping failed for device_type=5, ret=-1

java - AWS Elastic Beanstalk Tomcat - 高内存使用率

android - 在发行版构建期间进行“Unexpected attempt to get register for a value without a register”,但不进行调试

android - runOnUiThread 没有调用

java - 如何创建一个 Whatsapp 按钮来向我的 Android 应用程序中的特定联系人发送消息?