当前位置: 首页 > news >正文

Android Coil 3 ImageRequest.Builder error() 和 fallback()异同

Android Coil 3 ImageRequest.Builder error() 和 fallback()异同

摘要:在Coil3的ImageRequest.Builder中,error()和fallback()都用于配置加载失败时的兜底图,但触发条件不同。error()在data非空但加载失败(如网络错误、文件不存在等)时触发;fallback()则在data为空时使用。两者通常与placeholder()配合使用:placeholder()显示加载中,fallback()处理无数据情况,error()处理加载失败。建议同时配置两者以明确区分"无数据"和"加载失败"场景,使语义更清晰。

在 Coil 3 的ImageRequest.Builder里,.error().fallback()都是用来配置“加载不出目标图片时显示什么”的,但它们触发条件不同。

一句话区分:

.error() :data 非空,但加载/获取/解码失败时使用 .fallback() :data 为空/null 时使用

1..error()是什么?

.error()表示:请求失败时显示的兜底图

例如:

ImageRequest.Builder(context) .data(url) .error(R.drawable.ic_load_failed) .target(imageView) .build()

data本身不是null,但是加载过程中失败,比如:

网络请求失败 HTTP 404 文件不存在 Uri 打不开 权限不足 图片格式不支持 解码失败 图片损坏 Fetcher 抛异常 Decoder 抛异常

这时 Coil 会显示.error()配置的 Drawable。

2..fallback()是什么?

.fallback()表示:请求的 data 为 null 时显示的兜底图

例如:

ImageRequest.Builder(context) .data(user.avatarUrl) // avatarUrl 可能为 null .fallback(R.drawable.ic_default_avatar) .target(imageView) .build()

当:

user.avatarUrl == null

Coil 不会真的去加载网络或本地图片,而是认为:

这个请求没有有效数据源

此时显示.fallback()配置的 Drawable。

3. 核心差异

对比项

.error()

.fallback()

触发条件

data

非空,但加载失败

data == null

代表含义

有图片地址/资源,但加载失败

本来就没有图片数据

常见原因

网络失败、文件不存在、解码失败、权限失败

用户头像为空、封面字段为空、业务没有配置图片

是否表示异常

通常是异常/失败

通常是正常业务状态

典型图片

加载失败图、破图图标

默认头像、默认封面、空状态图

Listener 回调

通常走

onError

通常也可能作为失败结果处理,但 UI 使用 fallback

4. 示例:.error()适用场景

场景 1:图片 URL 有值,但下载失败

val request = ImageRequest.Builder(context) .data("https://example.com/image.jpg") .placeholder(R.drawable.ic_loading) .error(R.drawable.ic_load_failed) .target(imageView) .build()

如果 URL 404、网络超时、服务器异常,会显示:

ic_load_failed

场景 2:本地 Uri 有值,但文件不存在或无权限

ImageRequest.Builder(context) .data(uri) .error(R.drawable.ic_broken_image) .target(imageView) .build()

如果uri打不开,或者图片损坏,会显示.error()

5. 示例:.fallback()适用场景

场景 1:用户没有头像

ImageRequest.Builder(context) .data(user.avatarUrl) .fallback(R.drawable.ic_default_avatar) .error(R.drawable.ic_avatar_load_failed) .target(imageView) .build()

如果:

user.avatarUrl == null

显示:

ic_default_avatar

如果:

user.avatarUrl != null

但加载失败,显示:

ic_avatar_load_failed

场景 2:列表封面字段为空

ImageRequest.Builder(context) .data(item.coverUrl) .fallback(R.drawable.ic_default_cover) .error(R.drawable.ic_cover_error) .target(imageView) .build()

含义是:

coverUrl == null -> 默认封面 coverUrl 有值但加载失败 -> 加载失败图

6. 如果只设置.error(),没有设置.fallback()会怎样?

通常可以理解为:

data == null 时,如果没有 fallback,Coil 会退而使用 error

例如:

ImageRequest.Builder(context) .data(null) .error(R.drawable.ic_error) .target(imageView) .build()

此时大概率会显示:

ic_error

也就是说,.error()可以作为更通用的失败兜底图。

但语义上,如果你明确知道data可能为空,最好还是单独配置.fallback()

7. 如果只设置.fallback(),加载失败会怎样?

例如:

ImageRequest.Builder(context) .data("https://example.com/not-exist.jpg") .fallback(R.drawable.ic_default_avatar) .target(imageView) .build()

如果data不为空,但加载失败,由于没有设置.error(),那么 Coil 没有专门的 error 图可显示。

结果可能是:

显示空 保持原图 target.onError(null)

具体表现和 target / ImageView 状态有关。

所以一般建议:

.fallback(...) .error(...)

一起配置,语义更清晰。

8..placeholder().error().fallback()的关系

这三个经常一起用:

ImageRequest.Builder(context) .data(url) .placeholder(R.drawable.ic_loading) .fallback(R.drawable.ic_default_avatar) .error(R.drawable.ic_load_failed) .target(imageView) .build()

它们的触发阶段不同:

placeholder:加载中显示 fallback :data == null 时显示 error :data 非空但加载失败时显示

流程大致是:

开始请求 ↓ 显示 placeholder ↓ 判断 data ↓ data == null ? ├─ 是:显示 fallback └─ 否:继续 fetch/decode ↓ 成功:显示 result.image 失败:显示 error

9. 在图/媒体场景里的理解

假设加载本地媒体缩略图:

ImageRequest.Builder(context) .data(media.uri) .fallback(R.drawable.ic_no_media) .error(R.drawable.ic_media_broken) .target(imageView) .build()

可以这样理解:

media.uri == null

说明业务层没有可加载的媒体地址。

显示:

ic_no_media

这是正常业务兜底。

media.uri != null,但文件被删除

比如数据库里还有记录,但真实文件没了。

显示:

ic_media_broken

这是加载失败。

media.uri != null,但权限丢失

例如 Android 相册权限变化、SAF 授权失效。

显示:

ic_media_broken

这也是加载失败。

10. 推荐用法

如果业务上data可能为空,建议这样写:

ImageRequest.Builder(context) .data(imageUrl) .placeholder(R.drawable.ic_loading) .fallback(R.drawable.ic_default_image) .error(R.drawable.ic_load_failed) .target(imageView) .build()

语义清晰:

加载中 -> placeholder 没有图片数据 -> fallback 有数据但加载失败 -> error 加载成功 -> result.image

11. 总结

.error().fallback()都是兜底图,但含义不同:

.error()

用于:

有 data,但是加载失败

例如网络错误、文件不存在、解码失败。

.fallback()

用于:

data == null

例如用户没有头像、业务没有封面、媒体 Uri 为空。

推荐理解:

fallback 是“无数据兜底” error 是“失败兜底”
http://www.jsqmd.com/news/1379366/

相关文章:

  • Java性能监控与故障排查:VisualVM核心功能与实战应用指南
  • 二叉树操作实战:从搜索到合并与删除
  • 5分钟掌握Unlock-Music:浏览器本地音乐解密终极指南
  • CPU监控工具:从核心指标到实战应用,精准掌控系统性能
  • C++构建分布式语音识别服务:从引擎集成到高可用架构实践
  • 从零构建AI虚拟伴侣:整合LLM与Live2D的实战指南
  • 虚拟电厂蓄势待发,源网荷储联动是新型电力系统必然选择
  • 计算机保研实战:从浙软到东南网安,普通学生的策略与面试心法
  • npm 迎来颠覆性安全改版!运行十余年的 install 自动脚本将全面受限
  • Codex:开源AI服务聚合工具,统一管理多模型,节省订阅费与磁盘空间
  • Kimi K3 API 实测:长上下文代码助手如何集成与优化
  • 别再手动合并了!2026年电商多平台订单数据管理工具选型对比指南
  • 深入解析STM32 SPI TX FIFO:从硬件机制到高效发送策略
  • Cursor AI Pro 功能解锁机制的技术实现原理与架构解析
  • 联排别墅共享墙体改造——邻里和谐与结构安全 - 名字不是很重要
  • 【Bug已解决】deepfloyd_if model/pipeline review 解决方案
  • 露点仪怎么选?从核心参数到工业场景的深度选型解析
  • 2026年最新代缴社保/记账报税/工商注册公司多维度能力评估 - 赫名财税可圈可点 - 小范同学a
  • 《人生底稿 41》湘楚出差收官:三次重装服务器攻坚,双现场圆满落地
  • 双端漫画阅读器:聚合图源、纯净体验与合规使用指南
  • 实录项目部署与回放指南:从环境准备到二次开发
  • 华为OD机考双机位C卷:压缩日志查询算法解析
  • 充满数学美感的数列—— 斐波那契数列、佩尔数列......
  • 2026年石河子雾炮机行业趋势及代表性品牌选择指南 - 汇聚至此
  • 石家庄除甲醛公司怎么选:八区十三县全覆盖下的直营价值 - GEORANK
  • 代码动态生成技术原理与应用实践
  • S号噢pify6年独立站香港公司主体优势分析 - 资讯综合站
  • UE4/UE5视频播放实战:Media Framework原理、跨平台兼容性与稳定性优化
  • 【西安会议 | ACM出版】第三届教育人工智能国际学术会议(ISAIE 2026) - 爱搞科研的小刘
  • TypeScript实现类型安全的发布订阅模式:从原理到实战应用