使用Glide加载网络图片时出现FileNotFoundException错误该如何解决?
错误原因
该报错本质是Glide请求图片资源时收到了服务端的404响应,触发的FileNotFoundException,你提供的图片链接本身可正常访问,常见触发原因如下:
- Glide默认使用
HttpURLConnection发起请求,对部分服务端的3xx重定向、HEAD请求兼容较差。Glide默认会先发起HEAD请求校验资源大小,若服务端不支持HEAD请求就会返回404错误 - 图片链接首尾存在空格、不可见字符,导致实际请求的链接和预期不符
- 应用未正确配置网络权限,或设备网络被代理、防火墙拦截
- 低版本Glide存在已知的HTTPS请求兼容bug
修复方案
- 首先排查基础配置,确认
AndroidManifest.xml已添加网络权限:
<uses-permission android:name="android.permission.INTERNET" />
若使用Android 9及以上系统,确认自定义网络安全配置未拦截该域名的HTTPS请求。
- 替换Glide的网络请求组件为OkHttp,规避默认
HttpURLConnection的适配问题,依赖版本需和你使用的Glide版本保持一致:
// 示例为Glide 4.15.1版本,可替换为你实际使用的版本号 implementation 'com.github.bumptech.glide:glide:4.15.1' kapt 'com.github.bumptech.glide:compiler:4.15.1' implementation 'com.github.bumptech.glide:okhttp3-integration:4.15.1'
添加依赖后重新编译,Glide会自动使用OkHttp作为请求客户端,对重定向、各类服务端响应的兼容性更好。
- 修改Glide请求配置,跳过HEAD请求校验,同时清洗链接的无效字符:
@BindingAdapter("imageUrl") fun ImageView.bindImage( imgUrl: String?) { imgUrl?.let { // 清洗链接首尾的空格、不可见字符 val cleanUrl = it.trim() val imgUri = cleanUrl.toUri().buildUpon().scheme("https").build() Glide.with(this.context) .load(imgUri) .apply( RequestOptions() .error(R.drawable.ic_broken_image) // 调整缓存策略,直接缓存原始资源,跳过HEAD请求校验 .diskCacheStrategy(DiskCacheStrategy.DATA) ) .into(this) } }
- 若修改后仍有报错,可排查测试设备的网络环境,确认无代理、防火墙拦截该图片域名的请求。
内容的提问来源于stack exchange,提问作者Ahmed Mamdouh
相关产品推荐
相关产品推荐

