You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用依赖同一Repo的多个UseCase以避免重复API调用?

解决多ViewModel/UseCase重复API请求的方案

你的两种方案的可行性分析

1. 基于时间窗口的缓存策略

把缓存逻辑封装在Repo层是最合理的选择,所有依赖该Repo的UseCase会自动复用缓存,无需改动上层业务逻辑。

  • 具体实现:在Repo的API请求方法中,维护缓存数据和对应的时间戳。每次调用时判断当前时间与缓存时间差是否在设定窗口内(比如10秒),符合条件则直接返回缓存;否则发起新请求并更新缓存与时间戳。
  • 优势:完全解耦上层逻辑,后续新增依赖该Repo的UseCase也能自动受益,不需要额外适配。
  • 注意事项:需预留强制刷新入口,比如用户主动下拉刷新时,跳过缓存直接发起新请求。

2. 共享ViewModel复用数据

适合数据需要在多个Fragment/Activity间共享的场景,将高频数据放在共享ViewModel中(通过Activity的ViewModelProvider创建,让子Fragment共用),首次请求后将数据存入ViewModel的LiveData/Flow,后续直接复用。

  • 优势:天然适配跨页面数据共享需求,同时避免重复请求。
  • 注意事项:ViewModel生命周期与宿主(如Activity)绑定,宿主销毁后缓存也会丢失;若只是同一页面内多个ViewModel重复请求,该方案会增加ViewModel的职责,可能违反单一职责原则。

补充其他可选方案

3. 内存+本地二级缓存

针对需要持久化缓存的场景,在Repo层同时实现内存缓存(解决短时间重复请求)和本地缓存(如Room、SharedPreferences,解决App重启后无需重新请求)。

  • 实现逻辑:优先读取内存缓存→内存无数据则读取本地缓存→本地无数据则发起API请求,请求成功后同时更新内存和本地缓存。

4. 请求去重合并

如果使用Coroutines或RxJava,可以在Repo层实现请求去重:当相同请求正在进行时,新的调用直接订阅已有请求的结果,而非发起新请求。

  • 示例(Coroutines):维护一个MutableMap<String, Deferred<Data>>,key为请求的唯一标识(如API路径+参数)。每次请求前检查map中是否存在未完成的Deferred,存在则返回其结果;不存在则发起请求,将Deferred存入map,请求完成后从map中移除。

内容的提问来源于stack exchange,提问作者krtkush

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 07:09:58