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

How to implement robust offline support with rx-kotlin?

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

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

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

密码是:

 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
  6. 中的数据

我想避免从 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())

    )