【问题标题】:Glide not loading image from memory at the first time when rotating (orientation change), and after that it is loading from memoryGlide 在旋转(方向改变)时第一次不从内存中加载图像,之后从内存中加载
【发布时间】:2015-08-26 21:56:52
【问题描述】:

Glide 在旋转(方向改变)时第一次不从内存中加载图像,之后从内存中加载。

我尝试增加内存大小、位图池大小、各种缓存策略……似乎没有任何效果……

我附上了一个视频。

https://youtu.be/szDnAGxrJLU

谢谢!

【问题讨论】:

标签: android image-loading android-glide


【解决方案1】:

您的ImageViews 在纵向和横向上的大小不完全相同,您可能正在使用fitCenter() 或centerCrop() 将图像大小调整为ImageView 大小。当你改变方向时,Glide 会从缓存中加载全尺寸图像,但它必须在显示之前先在后台线程上调整它的大小,这就是为什么你在第一次方向改变后看到延迟的原因。在纵向和横向调整大小的图像都在内存缓存中后,不再有延迟。

【讨论】:

    【解决方案2】:

    .dontAnimate() 将此添加到 Glide 解决了我的问题

    Glide.with(view.getContext())
                .load(url)
                .placeholder(placeholder_image_crop))
                .dontAnimate()
                .into(view)
    

    您可能会因为

    而遇到此问题

    CircleImageView/CircularImageView/RoundedImageView 已知与 TransitionDrawable 存在问题 (.crossFade() 与 .thumbnail() 或 .placeholder()) 和动画 GIFs,使用 BitmapTransformation (.circleCrop() 将在 v4 中可用) 或 .dontAnimate() 来解决问题。

    有关更多查询,请参阅以下链接,它可能会对您有所帮助。 link 1 和 link 2

    【讨论】:

    • 如果您使用de.hdodenhof.circleimageview.CircleImageView,则需要添加dontAnimate(),如本答案所示
    • 这也解决了我的问题。创建片段后,第一次调用函数时图像不会加载。我会销毁并重新创建片段,然后它会加载。添加 dont animate() 为我修复了它
    【解决方案3】:

    只是为了强调上面写的内容并添加解决方案。

    可以更改磁盘缓存策略以缓存源图像,但不能更改内存缓存策略,否则除非大小相同,否则不会命中。

    我所做的是使用 .override(width,height) 来覆盖此策略并将源图像保留在内存缓存中。

            Glide.with(context)
                 .load(imgUrl)
                 .crossFade()
                 .override(imageWidth,imageHeight)
                 .into(imgView);
    

    【讨论】:

      【解决方案4】:

      要从缓存中加载图像,您可以传递DiskCacheStrategy.SOURCE 以从缓存中加载图像。

      您可以使用如下所示的 glide 并保持不设置动画方法,因为它有助于在适配器中加载图像而无需更新完整列表。更多请查看this

      Glide.with(context)
          .load(row_object.getImage())
          .dontAnimate() // will load image
          .diskCacheStrategy(DiskCacheStrategy.SOURCE)
          .placeholder(ContextCompat.getDrawable(context,
              R.mipmap.ic_user_placeholder_50dp))
          .into(holder.rowIvPostUserIcon);
      

      【讨论】:

      • .dontAnimate() 将此添加到Glide 解决了我的问题。谢谢
      • 我也一样@Sagar。图像第一次没有加载(必须打开另一个屏幕并返回查看)。添加.dontAnimate() 解决了这个问题。我从 2015 年开始使用 Glide,但以前从未这样做过。真的很奇怪:/
      • @AlbertVilaCalvo 问题出在圆形图像视图上,请查看我在下面发布的答案。
      • 感谢@Sagar,我正在从事的项目确实使用了de.hdodenhof.circleimageview.CircleImageView
      【解决方案5】:

      这段代码对我有帮助:

      Glide.with(view.getContext())
                      .load(url)
                      .placeholder(AppCompatResources.getDrawable(view.getContext(), R.drawable.vector_placeholder_vendor_image_crop))
                      .dontAnimate()
                      .into(view);
      
      //need add .dontAnimate()
      

      更多信息: https://github.com/bumptech/glide/issues/1026#issuecomment-191709837

      【讨论】:

      • 虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。
      【解决方案6】:

      第一次滑翔无法在圆形 Imageview 等自定义视图上加载图像。您可以使用错误在第一次加载图像。

      下面的 sn-p 应该可以帮到你:

       Glide.with(context)
               .load(imgUrl)
               .crossFade()
               .override(imageWidth,imageHeight).error(R.drawable.yourdrawable)
               .into(imgView);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-12-11
        • 1970-01-01
        • 1970-01-01
        • 2012-06-01
        • 2015-09-20
        • 1970-01-01
        • 2023-03-10
        相关资源
        最近更新 更多