滑行不加载真实图像并坚持占位符



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

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

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

我已确保传递有效且有效的网址。而且,如果我使用相同的代码而不使用占位符,它可以正常工作

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

知道为什么吗?

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

正确的代码是

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

希望对您有所帮助。

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

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

如果没有互联网连接,Glide 不会触发异常。

在清单的应用程序标记中添加android:usesCleartextTraffic="true",并检查是否在同一清单文件中提及互联网权限:-

在下面添加此权限以访问资源终结点/URL

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

如果目标终结点/URL 只有 http,请在清单.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>

安卓清单.xml

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

如果您尝试以下步骤:

  • 已在清单和编程方式中添加了 INTERNET 权限
  • usesCleartextTraffic :如果已经在清单中提到即使图像未在图像视图中加载

然后试试这个:

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

使用进度条作为加载 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.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) { ... }

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

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

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

        <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"
            />

它对我有用。

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

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

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

所以诀窍是通过setImageDrawable()设置占位符,所以ImageView会像往常一样显示它,但你告诉 Glide 明确使用fitCenter,这将很好地适合加载的图像,通过变换在ImageView的布局大小内,然后通过setImageDrawable()设置它。由于拟合的图像是完全拟合的,因此中心将只绘制覆盖整个视图区域的图像。

试一试。

不要使用过渡或动画 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);

可能会帮助某人:) 我的问题是网络安全策略异常。由于安全策略,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

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

如果以上方法都无法解决,并且您在 ImageView 上设置了"src"属性,它将不起作用。我错误地在 xml 中设置了 ImageView 上的"src",并将其取出为我解决了它。

就我而言,我在 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(链接(,因为它可能是页面链接而不是确切的图像地址,尝试复制链接并将其粘贴到浏览器中,看看它是否只打开图像或网页,如果它打开网页,那么毫无疑问,这就是问题所在,它是一个页面链接,而不是图像地址。

最新更新