移动/游戏
Android 离线优先数据层:用 Repository…
适用于 Android 应用需要以本地数据库为唯一数据源、离线优先读取并同步后端数据的场景。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
Android 离线优先数据层:用 Re特定
解决思路
- 让数据层协调多个数据源,把本地 Room 缓存与远程 Retrofit 请求统一通过 Repository 对外提供。
- 使用 Repository 模式,将 Repository 作为唯一数据源(Single Source of Truth, SSOT)。
- 由 Repository 决定返回缓存数据还是拉取新数据。
- 实现 Repository 时注入 NewsDao 与 NewsApi,例如 class NewsRepository @Inject constructor(private val newsDao: NewsDao, private val newsApi: NewsApi)。
- 将本地数据库数据暴露为唯一数据源,例如 val newsStream: Flow<List<News>> = newsDao.getAllNews()。
- 在 Repository 中提供同步操作,例如 suspend fun refreshNews():先调用 val remoteNews = newsApi.fetchLatest(),再调用 newsDao.insertAll(remoteNews)。
- 使用 Room 作为主要缓存和离线存储。
- 用 @Entity 定义 Room 数据类实体。
- 让 Room DAO 对可观察数据返回 Flow<T>。
- 使用 Retrofit 从后端获取数据。
- 在 Retrofit 接口中使用 suspend 函数。
- 用 try-catch 或 Result 包装网络调用,优雅处理 NoInternet、404 等异常。
- 读同步采用「先展示旧数据再后台重新验证」(Stale-While-Revalidate):立即显示本地数据,并触发后台刷新。
- 写同步采用 Outbox Pattern(发件箱模式,进阶):立即保存本地更改,标记为 unsynced,使用 WorkManager 将更改推送到服务器。
- 依赖注入:在 Hilt Module 中将 Repository 接口绑定到实现。
- 示例绑定写法:@Binds abstract fun bindNewsRepository(impl: OfflineFirstNewsRepository): NewsRepository。
适用边界 · 注意事项
- 不适用于非 Android 项目,或不需要 Room、Retrofit、Hilt、WorkManager 等 Android 生态组件的场景。
- 不适用于没有离线缓存、本地数据库或后台同步需求的简单一次性网络请求。