我有一个来自服务器行代码的非常基本的加载图像:
Glide.with(view.getContext()).load(url).placeholder(R.drawable.default_profile).into(view);
出于某种原因,我总是坚持使用显示的占位符,而不是真实的图像!
我已确保传递了有效且有效的网址。并且,如果我在没有占位符的情况下使用相同的代码,那么它可以正常工作
Glide.with(view.getContext()).load(url).into(view);
任何想法为什么?
答案 0 :(得分:82)
尝试添加.dontAnimate()
它也是由TransitionDrawable引起的,看起来好像滚动之后没有动画因为它被缓存了。
正确的代码是
Glide.with(view.getContext()).load(url).placeholder(R.drawable.default_profile).dontAnimate().into(view);
我希望对你有所帮助
答案 1 :(得分:32)
检查您是否在清单中添加了Internet权限:
<uses-permission android:name="android.permission.INTERNET"/>
如果没有互联网连接,Glide不会触发异常。
答案 2 :(得分:3)
在清单的应用程序标签中添加android:usesCleartextTraffic =“ true”,并检查是否在同一清单文件中提到了互联网许可:-
答案 3 :(得分:2)
使用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);
答案 4 :(得分:2)
如果将来有人遇到此问题,您可能需要添加
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
确定此更改的确切原因,但我的代码在没有该权限的情况下无效,现在可以使用它。
答案 5 :(得分:2)
如果您尝试以下步骤:
然后试试这个:
android:usesCleartextTraffic="true"
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
答案 6 :(得分:1)
不要为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);
答案 7 :(得分:0)
似乎很奇怪,但我唯一可以猜到的是你的网址是有效的,正如你已经说过的那样。您的遥控器即使已应用于您的图像视图也会被下载,但您的占位符会以某种方式隐藏它。 Glide有一些与占位符相关的错误。
我的建议是尝试以下内容:
Glide.with(view.getContext()).load(url).
placeholder(R.drawable.default_profile).fitCenter().into(view);
所以诀窍是占位符是通过setImageDrawable()
设置的,所以ImageView
会像往常一样显示它,但是你告诉Glide明确地使用fitCenter
,这将很好地适合加载的图像通过转换在ImageView
的布局大小内,然后通过setImageDrawable()
进行设置。由于拟合的图像非常合适,因此中心只会绘制覆盖整个视图区域的图像。
试一试。
答案 8 :(得分:0)
以下是对我有用的奇怪修复程序。
以下对我来说总是失败的(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) { ... }
如您所见,这里唯一的区别是我添加了一个侦听器。毫无道理,但是这些试验都是非常仔细地完成的,因此我将继续进行。
答案 9 :(得分:0)
以上所有解决方案都不适合我。问题可能出在您使用的占位符。如果您用于加载图像的视图具有占位符,则会引起一些问题。出于某种原因删除该占位符似乎可以解决该问题。
因此,如果您要膨胀的(Image)视图具有占位符,例如 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"
/>
对我有用。
答案 10 :(得分:0)
可以帮助某人:) 我的问题是网络安全策略异常。由于安全政策,Android封锁了Glide请求的网址。
通过将所需域列入白名单来解决。 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
最困难的是它没有在正常日志中显示。
答案 11 :(得分:0)
如果以上方法均不能解决问题,并且您在ImageView上设置了'src'属性,则它将无法正常工作。我错误地在xml中的ImageView上设置了“ src”,然后取出来解决了这个问题。