【问题标题】:Long display time for pictures using Glide使用 Glide 的图片显示时间长
【发布时间】:2019-03-25 01:03:49
【问题描述】:

我正在使用 Retrofit 向 Imgur 发出 API 请求,以便检索大约 40 个 URL,然后使用 Glide 将它们显示在 RecyclerView 中,如下所示:

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    Glide
            .with(context)
            .load(list.get(position).getLink()) // Gets the URL in my list
            .centerCrop()
            .placeholder(R.mipmap.placeholder)
            .crossFade()
            .into(holder.imageView);
}

请求会很快得到答复,但我的大多数图像都保留为占位符,因为其中一些稍后会一张一张地出现。

是什么导致我的图像显示出现延迟?这可能与我的互联网连接速度有关吗?

另外,当涉及到“大量”图片时,我的方法是否正确?

请注意,大多数ImageViews 不会加载,即使是我的用户可见的那些。

【问题讨论】:

  • 图片尺寸是多少?
  • 这取决于图像有多大,API 的响应时间是多少。
  • 网址格式为“imgur.com/a/XXXXX”,取决于是否为动画、大小等。
  • @SijanGurung:响应时间不到一秒
  • 关于为什么毕加索会是一个更好的选择的任何细节? Glide 处理图像裁剪、占位符等。

标签: android retrofit android-glide


【解决方案1】:

这可能取决于您的互联网连接。如果是这样,您可以使用更小的 imgur,您可以在文件名末尾添加这些字母之一:

  • s = 小正方形 (90×90)
  • b = 大正方形 (160×160)
  • t = 小缩略图 (160×160)
  • m = 中等缩略图 (320×320)
  • l = 大缩略图 (640×640)
  • h = 巨大的缩略图 (1024×1024)

这个:

http://i.imgur.com/bF8zPs4.jpg

变成这个(对于小方块):

http://i.imgur.com/bF8zPs4s.jpg

【讨论】:

  • 我的链接格式是http://imgur.com/a/xxxxx,我没有指向图片位置的链接。
  • 这不是相册的网址吗?
  • 这些是来自画廊的 URL(我执行 API 请求以检索画廊第 X 页上当前显示的图像列表)。
  • 您使用哪些 API 端点?如果您使用https://api.imgur.com/3/album/{id},您可以获得专辑中每张图片的列表。然后每个图像都有你可以解决的链接。
  • 我目前正在使用https://api.imgur.com/3/gallery/hot/viral/{page}
【解决方案2】:

在 Glide 中设置好图片的 url 后,图片本身仍然需要下载并显示在 ImageView 中,这会导致延迟。如果图片没有加载,你能检查一下图片url是否在你的浏览器中加载了图片吗?

使用 Glide 在适配器中加载图像的更好方法是使用在适配器的构造函数中传递的 RequestManager。然后 Glide 将订阅你的片段活动的生命周期。这将防止在您的 Fragment 活动被破坏时下载图像,这在 Glide 必须下载大图像时特别有用。

public MyAdapter(List<Object> items, RequestManager requestManager) {
    this.items = items;
    this.requestManager = requestManager;
}    

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    requestManager
            .load(list.get(position).getLink()) // Gets the URL in my list
            .centerCrop()
            .placeholder(R.mipmap.placeholder)
            .crossFade()
            .into(holder.imageView);
}

然后您可以在活动或片段中调用适配器的构造函数:

MyAdapter myAdapter = new MyAdapter(items, Glide.with(this));

我在找到this answer from TWiStErRob之后一直在使用这种方法。

【讨论】:

    【解决方案3】:

    这取决于您的互联网连接速度和图片大小。
    如果图像尺寸过大,可能会导致内存异常。

    【讨论】:

    • 这可能是问题所在,imgur 上的某些图像非常宽。知道如何解决这个问题吗?
    • 看到这个answer可能对你有帮助的@Christopher
    【解决方案4】:

    Recyclerview 中,Glide 只加载 visible imageViews 中的图像。一旦您向下滚动,不可见的 ImageView将被加载。这是由于 RecyclerViewrecycler 属性造成的。

    在你onBindViewHolder中添加以下行并查看日志,你会明白的:

    Log.w("Link", list.get(position).getLink());
    

    【讨论】:

    • 这不是我的问题,也许我不够清楚。即使是看到的 ImageView 也不会加载。
    猜你喜欢
    • 1970-01-01
    • 2021-08-24
    • 1970-01-01
    • 2019-03-09
    • 1970-01-01
    • 2020-07-02
    • 1970-01-01
    • 1970-01-01
    • 2020-12-18
    相关资源
    最近更新 更多