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