Repository 方法设计:suspend 与 Flow 的决选择指南(以朋友圈为例)

在Repo接口定义中,常见两类函数:

  • suspend functions:返回单一结果
  • 普通函数返回 Flow:返回一个结果流

这两类函数在 Room DAO 等库中都有体现。例如 observeUsers() 返回 Flow,因为它是一个观察者,每次表变化都会发射新的用户列表。


一、通用原则

  • 使用 suspend:当函数只产生一个结果时,例如数据库查询或调用外部服务
  • 使用 Flow:当函数可能产生未知数量的结果时,例如 WebSocket 连接或数据库观察

不推荐在只期望一个结果的场景使用 Flow,原因包括:

  1. 语义误导Flow 暗示多个结果
  2. 复杂度更高suspend 更简单、可读性更好、易于调试

二、朋友圈发送场景 ------ 使用 suspend

在发送朋友圈的业务中,很多操作都是一次性触发并返回结果,因此适合用 suspend

  • 发布朋友圈:用户点击"发送"后,等待结果返回
  • 删除朋友圈:一次性操作,执行后即结束
  • 点赞/取消点赞:触发后立即返回结果
  • 发表评论:提交后返回成功或失败

示例接口

三、朋友圈动态场景 ------ 使用 Flow

朋友圈的另一类需求是实时动态更新,例如:

  • 朋友圈列表:新内容发布后,列表需要自动刷新
  • 特定朋友圈详情:点赞数、评论数随时变化
  • 新朋友圈通知:好友发布新动态时推送
  • 互动更新:点赞、评论的实时变化

示例接口

四、 ViewModel与状态管理

ViewModel 的可观察状态通常用 StateFlow 表示。 因此,API 暴露 Flow 会更容易消费,可以直接用 stateIn 转换为 StateFlow

  • 小型应用:用 Flow 到处都行,差别不大
  • 复杂领域模型:滥用 Flow 会成为负担,suspend 更简洁
  • 最佳实践:可以定义辅助函数,把 suspend 转换为 StateFlow,避免强行用 Flow everywhere (不要为了迎合 ViewModel 的需要而让数据层所有 API 都返回 Flow,而是保持数据层 API 的简洁性(使用挂起函数),然后在 ViewModel 层通过辅助函数将一次性操作的结果转换为 StateFlow)。

五、决策流程图

我总结了一个图,如下:

六、总结原则

特征 suspend Flow
数据特性 静态,一次性 动态,持续变化
结果数量 单次结果 多个值序列
使用场景 发送朋友圈、删除、点赞、评论 列表更新、通知、互动变化
生命周期 执行完即结束 持续到取消收集

简单记忆

  • 操作像 动词 (做某事,例如"发送朋友圈") → 用 suspend
  • 操作像 名词 (观察某物,例如"朋友圈动态") → 用 Flow
相关推荐
千里马学框架2 天前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台2 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone2 天前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
致远ccc2 天前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
ttyyttemo2 天前
Kotlin 协程中的 Job 结构化并发与取消
android
sun0077002 天前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
其实防守也摸鱼2 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
AFinalStone2 天前
Android7 SystemUI 源码解析(四)NavigationBar 导航栏与 SystemBars
android·systemui
JMchen2 天前
属性动画原理与高级动画实现
android·kotlin·canvas
AFinalStone2 天前
Android7 SystemUI 源码解析(二)启动流程深度解析
android·systemui