一起Talk Android吧(第四百一十七回:解决Glide不能加载网络图片的方法)
Posted talk_8
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一起Talk Android吧(第四百一十七回:解决Glide不能加载网络图片的方法)相关的知识,希望对你有一定的参考价值。
文章目录
各位看官们,大家好,上一回中咱们说的例子是"绘制正弦波总结",这一回咱们介绍的例子是"解决Glide不能加载网络图片的方法"。闲话休提,言归正转,让我们一起Talk android吧!
使用背景
最近在项目中使用Glide加载网络图片时发现部分图片无法正常加载,于是着手去解决。因为只有部分图片有问题,所以决定从网络上入手,看看不能被加载的图片与可以被加载的图片之间有什么区别。这是一个解决思路,最重要的还是分析出错时的log。我们决定从这两方面去解决问题。
查看log
当正常加载图片时不会打印出错误信息,如果加载图片发生错误就会打印相关的Log.在log中搜索Glide关键字就可以看到相关的信息,下面是一个示例
W/Glide: Load failed for xxx
经过分析后发现错误发生在Glide的源文件中,大体原因是访问不到网络上的图片,看来还是网络的原因。
分析网络
经过对比分析,我们发现不能被载的网络图片使用http协议,而可以被加载的网络图片使用https协议。看来是网络协议引起的,于是我想到了android对访问不同协议网络的限制:
在androidP(9)之后不允许使用明文访问网格。
这个问题在使用WebView时出遇到过,WebView在AndroidP之后就不能使用http协议访问网站。
解决方法
知道原因后就可以解决问题了,修改网络相关的配置:
方法一
新建一个名叫actions的xml文件,并且把它配置到在Manifest
文件中Application
标签下。配置方法和xml文件中的代码如下:
android:networkSecurityConfig="@xml/actions"
<!-- xml文件中的内容 -->
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>
方法二
在Manifest
文件的Application
标签中配置相关的属性,具体方法如下:
android:usesCleartextTraffic="true"
这两个方法都可以解决此问题,大家选择其中一种方法就可以。
经验总结
我的经验是遇到问题时通过对比分析问题正确和出错时的现象来确定大体的解决方向,然后通过log定位错误的原因,另外我们可以在Glide中做一些处理,当发生错误时也有一个备用方案,不
至于无法显示图片。
我的做法是添加监听器和错误时的图片。监听器使用listener
()方法,显示错误时的图片使用error
()方法。如果发生错误了就会显示发生错误时的图片,而不至于在发生错误时显示黑色或者一片空白。这样给人的感受会相对好一些,同时在监听器中对错误做相关的处理。下面是示例代码,我们在示例代码中打印了错误的信息,大家可以自己添加相关的错误处理方法。
Glide.with(this)
.load(icon_url)
.listener(new RequestListener<Drawable>()
@Override
public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource)
Log.d(TAG, "onLoadFailed: error: "+e.toString());
return false;
@Override
public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource)
return false;
)
.error(R.drawable.ic_runing_error)
.into(mImageView);
看官们,关于Android中"解决Glide不能加载网络图片的方法"的例子咱们就介绍到这里,欲知后面还有什么例子,且听下回分解!
以上是关于一起Talk Android吧(第四百一十七回:解决Glide不能加载网络图片的方法)的主要内容,如果未能解决你的问题,请参考以下文章
一起Talk Android吧(第三百一十七回:Android中的虚拟按键)