gpt4 book ai didi

android - 如何使用 rx-kotlin 实现强大的离线支持?

转载 作者:行者123 更新时间:2023-11-30 04:54:00 25 4
gpt4 key购买 nike

TL;DR 寻找有关使用 rx-kotlin 的强大离线支持的建议。

我关注了一个不错的 guide on offline-support in Android apps .它是这样工作的:

  1. 从网络加载数据,出错转第3步
  2. 将数据存入本地数据库
  3. 从本地数据库加载数据
  4. 在 UI 中显示数据

代码是:

 Observable.mergeDelayError(
loadRemoteData()
.doOnNext { writeDataToLocalDatabase(it) }
.subscribeOn(Schedulers.io()),
loadDataFromLocalDatabase()
.subscribeOn(Schedulers.io())
)

不幸的是,这种方法依赖于始终有效的数据库代码。如果由于某种原因数据库操作失败,则一切都会失败,即使从远程服务器成功加载数据也是如此。

有没有一种方法可以使用 rx-kotlin/rx-java 实现以下目标?:

  1. 从网络加载数据,出错转第3步
  2. 将数据存入本地数据库
  3. 从本地数据库加载数据
  4. (如果第 2 步或第 3 步失败)使用第 1 步中的数据
  5. 在 UI 中显示数据

我想避免从 Internet 加载数据两次。如果重要的话,我正在使用房间 + 改造。

编辑:感谢@MinseongPark,我得到了下面的代码。mergeDelayError 仅在远程和本地源均失败时报告错误,并且如果 writeDataToLocalDatabase 方法失败(抛出异常),则不会阻止远程数据报告给 UI。 writeDataToLocalDatabase 中的错误信息通过远程报告保存。现在,该代码对于两个来源之一失败以及将新条目写入数据库失败的情况都很健壮。

        return Observable.mergeDelayError(
loadRemoteData().doOnNext {
try {
writeDataToLocalDatabase(it)
} catch (error: Throwable) {
Timber.d(error)
Crashlytics.logException(error)
}
},
loadDataFromLocalDatabase()
)
.subscribeOn(Schedulers.io())

最佳答案

试试这个。

    Observable.mergeDelayError(
loadRemoteData()
.doOnNext { runCatching { writeDataToLocalDatabase(it) } }
.subscribeOn(Schedulers.io()),
loadDataFromLocalDatabase()
.onErrorResumeNext(Observable.empty())
.subscribeOn(Schedulers.io())

)

关于android - 如何使用 rx-kotlin 实现强大的离线支持?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59523262/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com