【问题标题】:Glide not loading real image and stuck with placeholderGlide 不加载真实图像并卡在占位符上
【发布时间】:2016-04-03 11:21:59
【问题描述】:

我有一个来自服务器行代码的非常基本的加载图像:

Glide.with(view.getContext()).load(url).placeholder(R.drawable.default_profile).into(view);

出于某种原因,我总是卡在显示的占位符而不是真实图像!

我已确保传递了一个有效且有效的 url。而且,如果我使用没有占位符的相同代码,它可以正常工作

Glide.with(view.getContext()).load(url).into(view);

有什么想法吗?

【问题讨论】:

  • 出于安全原因,Android 不允许某些 URL。考虑在清单文件中添加android:usesCleartextTraffic="true"。详细答案是here

标签: android android-glide


【解决方案1】:

尝试添加.dontAnimate() 它也是由 TransitionDrawable 引起的,似乎是因为滚动后没有动画,因为它被缓存了。

正确的代码是

Glide.with(view.getContext()).load(url).placeholder(R.drawable.default_profile).dontAnimate().into(view);

希望对你有帮助。

【讨论】:

  • 出于某种奇怪的原因,这解决了问题。虽然没有动画,但过渡很丑。
  • Glide v4.0.0 中不存在占位符
  • 正如 Glide 的 README.md 所说,已知 CircleImageView/CircularImageView/RoundedImageView 与 TransitionDrawable (.crossFade() 与 .thumbnail() 或 .placeholder()) 和动画 GIF 有问题,请使用BitmapTransformation(.circleCrop() 将在 v4 中可用)或 .dontAnimate() 来解决问题。
【解决方案2】:

检查您是否在清单中添加了 Internet 权限:

<uses-permission android:name="android.permission.INTERNET"/>

如果没有 Internet 连接,Glide 不会触发异常。

【讨论】:

  • 确实!这解决了我的麻烦。我认为,当开发人员犯这样的错误时,如果 glide 引发 Exception 会更有用。
【解决方案3】:

在 manifest 的 application 标签中添加 android:usesCleartextTraffic="true" 并检查在同一个 manifest 文件中是否提到了 internet 权限:-

【讨论】:

    【解决方案4】:

    使用 ProgressBar 作为加载 gif

    Glide.with(context).
            load(url)
            .listener(new RequestListener<String, GlideDrawable>() {
                @Override
                public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) {
                    progressBar.setVisibility(View.GONE);
                    return false;
                }
    
                @Override
                public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
                    progressBar.setVisibility(View.GONE);
                    return false;
                }
            })
            .crossFade(1000)
            .into(imageView);
    

    【讨论】:

      【解决方案5】:

      如果以后有人遇到这种情况,你可能需要添加

      <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
      

      不确定此更改的确切原因,但我的代码在没有该权限的情况下无法运行,现在可以使用它。

      【讨论】:

        【解决方案6】:

        下面是一个对我有用的奇怪修复。

        以下对我来说总是失败(12 次试验) - 我从来没有看到真实的图像:

        Glide.with(context)
         .load(url)
         .asBitmap()
         .into(new SimpleTarget<Bitmap>(iconWidth, iconHeight) { ... }
        

        以下对我来说总是成功(12 次试验) - 我总是看到真实的图像:

        Glide.with(context)
         .load(url)
         .asBitmap()
         .listener(new RequestListener() {
            public boolean onException(Exception e,Object o,Target t,boolean b)
                       {return false;}
            public boolean onResourceReady(Object o,Object p,Target t,boolean b,boolean c)  
                       {return false;}})
         .into(new SimpleTarget<Bitmap>(iconWidth, iconHeight) { ... }
        

        如您所见,这里唯一的区别是我添加了一个侦听器。没有什么意义,但这些试验做得非常仔细,所以我会继续这样做。

        【讨论】:

        • 奇怪...这也为我解决了...任何想法为什么?
        【解决方案7】:

        不要为 Glide 使用过渡或动画。它会解决你的问题

        代码:

        Glide.with(context)
            .load(horizontalHappyHourList.get(position).getImage())
        //  .transition(DrawableTransitionOptions.withCrossFade(400)) //Optional
            .apply(RequestOptions.diskCacheStrategyOf(DiskCacheStrategy.RESOURCE)
            .error(R.drawable.no_image))
            .into(holder.imageView);
        

        【讨论】:

          【解决方案8】:

          以上解决方案都不适合我。问题可能出在您正在使用的占位符上。如果您用于加载图像的视图具有占位符,则会导致一些问题。出于某种原因删除该占位符似乎可以解决它。

          因此,如果您尝试膨胀的 (Image)View 有一个占位符,例如 android:src="@mipmap/placeholder",请将其删除。

                  <ImageView
                      android:id="@+id/imgGallery"
                      android:layout_width="match_parent"
                      android:layout_height="wrap_content"
                      android:layout_centerHorizontal="true"
                      android:adjustViewBounds="true"
                      android:scaleType="centerCrop"
                      android:src="@mipmap/rugova1" />
          

          喜欢这个

           <ImageView
                      android:id="@+id/imgGallery"
                      android:layout_width="match_parent"
                      android:layout_height="wrap_content"
                      android:layout_centerHorizontal="true"
                      android:adjustViewBounds="true"
                      android:scaleType="centerCrop"
                      />
          

          它对我有用。

          【讨论】:

            【解决方案9】:

            如果您尝试以下步骤:

            • 已在 Manifest 和 Programmatically 中添加了 INTERNET 权限
            • usesCleartextTraffic : 如果清单中已经提到 即使图像未在 ImageView 中加载

            然后试试这个:

            • 添加这一行application Manifest标签
            android:usesCleartextTraffic="true"
            
            • 在您尝试执行操作的 Activity 或 Fragment 中添加以下代码
            StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
            StrictMode.setThreadPolicy(policy);
            

            【讨论】:

              【解决方案10】:

              看起来很奇怪,但我唯一能猜到的是您的 URL 是有效的,正如您已经说过的那样。你的遥控器被下载,甚至被应用到你的图像视图上,但你的占位符以某种方式隐藏了它。 Glide 有一些与占位符相关的错误。

              我的建议是尝试以下方法:

              Glide.with(view.getContext()).load(url).
              placeholder(R.drawable.default_profile).fitCenter().into(view);
              

              所以诀窍是通过setImageDrawable() 设置占位符,因此ImageView 将照常显示它,但您告诉Glide 明确使用fitCenter,这将很好地适合ImageView 中加载的图像s 通过 Transformation 布局大小,然后通过 setImageDrawable() 设置它。由于拟合后的图像非常合适,因此 center 只会绘制覆盖整个视图区域的图像。

              试一试。

              【讨论】:

                【解决方案11】:

                可以帮助某人:) 我的问题是网络安全策略异常。由于安全策略,Glide 请求的 URL 被 android 阻止。

                已通过将所需域列入白名单来修复。 Check here

                com.bumptech.glide.load.engine.GlideException: Failed to load resource
                There was 1 cause:
                java.net.UnknownServiceException(CLEARTEXT communication to maps.googleapis.com not permitted by the network security policy)
                 call GlideException#logRootCauses(String) for more detail
                

                最难的是它没有显示在正常的日志中。

                【讨论】:

                  【解决方案12】:

                  在下方添加此权限以访问资源端点/url

                  <uses-permission android:name="android.permission.INTERNET"/>
                  

                  如果您的目标端点/url 只有 http 在您的 manifest.xml 中添加以下代码。从 Android 9(API 级别 28)开始,默认禁用明文支持。

                  android:usesCleartextTraffic="true"
                  

                  因此,如果您从未加密的 HTTP API 获取资源,请不要忘记添加

                  res/xml/network_security_config.xml
                  

                  所以代码会是这样的

                  network_security_config.xml

                  <?xml version="1.0" encoding="utf-8"?>
                  <network-security-config>
                      <domain-config cleartextTrafficPermitted="true">
                          <domain includeSubdomains="true">urweb.id</domain>
                          <domain includeSubdomains="true">localhost</domain>
                          ...
                          <domain includeSubdomains="true">111.222.333.444</domain>
                      </domain-config>
                  </network-security-config>
                  

                  AndroidManifest.xml

                  <?xml version="1.0" encoding="utf-8"?>
                  <manifest ...>
                  
                      <uses-permission android:name="android.permission.INTERNET"/>
                  
                      <application
                          ...
                          android:usesCleartextTraffic="true"
                          ...>
                      
                          <activity>
                          ...
                          </activity>
                      </application>
                  
                  </manifest>
                  

                  【讨论】:

                    【解决方案13】:

                    如果以上方法都不能解决问题,并且您在 ImageView 上设置了 'src' 属性,它将无法正常工作。我错误地在 xml 中的 ImageView 上设置了“src”,然后把它拿出来为我解决了。

                    【讨论】:

                      【解决方案14】:

                      就我而言,我在 xml 中设置的 layout_height attr 存在问题

                      <ImageView
                              android:id="@+id/image_view_image"
                              android:layout_width="0dp"
                              android:layout_height="wrap_content"
                              android:visibility="gone"
                              app:layout_constraintBottom_toTopOf="@id/linear_layout_content"
                              app:layout_constraintDimensionRatio="16:9"
                              app:layout_constraintLeft_toLeftOf="@id/linear_layout_content"
                              app:layout_constraintRight_toRightOf="@id/linear_layout_content"
                              app:layout_constraintTop_toTopOf="@id/linear_layout_content" />
                      

                      Glide 在 logcat 中给出了一条警告,我不记得它是什么,但它建议避免使用 wrap_content 作为宽度和高度。

                      所以我所做的只是修改布局以避免使用wrap_content,问题就解决了。

                      我尝试在问题解决后重新生成该问题以获取警告行,但我做不到。好像是库的缓存问题。

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 2019-01-24
                        • 1970-01-01
                        • 1970-01-01
                        • 2014-05-12
                        • 1970-01-01
                        • 2015-11-21
                        • 2016-06-23
                        • 1970-01-01
                        相关资源
                        最近更新 更多