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 而不是图像地址的问题。
我有一个来自服务器行代码的非常基本的加载图像:
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 而不是图像地址的问题。