Glide 未加载真实图像并卡在占位符上

Glide not loading real image and stuck with placeholder

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

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

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

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

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

知道为什么吗?

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

我的建议是尝试以下操作:

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

所以技巧是通过 setImageDrawable() 设置占位符,所以 ImageView 将像往常一样显示它,但是你告诉 Glide 显式地使用 fitCenter 这将适合加载通过转换将图像很好地置于 ImageView 的布局尺寸内,然后通过 setImageDrawable() 进行设置。由于拟合图像是完美拟合,center 将绘制覆盖整个视图区域的图像。

试一试。

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

正确的代码是

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

希望对你有所帮助

使用 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);

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

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

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

如果以后有人遇到这个问题,您可能需要添加

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

不确定此更改的确切原因,尽管如此,我的代码在没有该许可的情况下无法运行,现在可以运行了。

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

以下对我来说总是失败(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) { ... }

如您所见,这里唯一的区别是我添加了一个侦听器。没有什么意义,但这些试验是非常仔细地完成的,所以我会接受它。

不要为 Glide.It 使用过渡或动画将解决您的问题

代码:

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);

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

因此,如果您尝试膨胀的 (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"
            />

它对我有用。

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

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

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

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

如果上面的 none 解决了它,而你在 ImageView 上设置 'src' 属性,它将不起作用。我错误地在 xml 中的 ImageView 上设置了 'src' 并将其取出为我解决了它。

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

如果您尝试执行以下步骤:

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

然后试试这个:

  • 添加此行 应用程序 Manifest
  • 标签
android:usesCleartextTraffic="true"
  • 在您尝试执行操作的 activity 或顶部片段中添加以下代码
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);

在下面添加此权限以访问资源 endpoint/url

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

如果您的目标 endpoint/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>

就我而言,我在 xml

中设置的 layout_height 属性有问题
<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,问题就解决了。

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

只需卸载应用程序并重新安装即可。它会起作用

确保检查 url (link),因为它可能是页面 link 而不是确切的图像地址,请尝试复制 link 并粘贴它到浏览器看它是否只打开图像或网页,如果它打开网页那么毫无疑问这是一个页面 link 而不是图像地址的问题。