【问题标题】:How to combine network and database updates in RxJava in Android application如何在 Android 应用程序中结合 RxJava 中的网络和数据库更新
【发布时间】:2019-02-03 11:19:42
【问题描述】:

我正在研究在我最新的 Android 应用程序中使用 RxJava。

我有两个相关更新的数据库模型对象列表

ListDB1 和 ListDB2

我试图实现的逻辑如下

1). For each item in ListDB1
1.1). Transform it to a Network model object
1.2). Execute an Update RESTful API

2). Once all network updates have completed successfully
2.1). Persist ListDB1 to my local database.
2.2). Persist ListDB2 to my local database.

到目前为止,我有这段代码应该调用我的网络 API

    Observable.just(getDatabaseList())
            .subscribeOn(Schedulers.io())
            .flatMapIterable(x -> x)
            .flatMap(database -> transformDatabase(database, DB_1_MAPPER))
            .doOnNext(NetworkController::updateRemote)
            .observeOn(AndroidSchedulers.mainThread())
            .doOnComplete(getOnComplete())
            .doOnError(getOnError())
            .subscribe();

虽然没有执行任何 API 调用

我宁愿使用Single Observable 作为我的 API 调用以 Single<Response> 响应,但是我看不到如何使用 Single 实现 Observable.just()。

我也看不到如何通过分别处理网络调用的每个列表项来开始我的 Rx 过程,然后使用完整列表执行数据库调用,因为我使用 Realm 作为我的本地数据库,它可以接受数据库对象列表单次更新。

在伪代码中,我的过程类似于:

for each database list item
convert to network model item
call remote update API
When all all network calls are successful
update database with ListDB1
update database with ListDB2
end

这可能在一个 Rx 进程“流”中实现吗?

【问题讨论】:

    标签: android rx-java2


    【解决方案1】:

    1.

    我宁愿使用 Observable 的 Single,因为我的 API 调用以 Single 响应,但是我看不到如何使用 Single 实现 Observable.just()。

    你可以这样做:

    Single.just(getDatabaseList()) // Single<>
    

    但是,Single 不适合这种情况,因为您没有使用 single 项目,而是需要遍历 multiple 项目和一件一件地处理。


    2.

    为网络调用分别处理每个列表项,然后使用完整列表执行数据库调用

    您可以使用toList() 运算符,它会在可观察对象完成时发出整个项目列表。


    3.

    do 运算符(例如 doOnNextdoOnCompletedoOnError)的目的是创建不影响流的副作用。此类操作的一个示例是日志记录。您不应执行任何影响此类运算符中的流的有意义的操作。

    相反,您应该使用mapflatMap 等运算符。


    4.

    把所有东西放在一起:

    Observable.fromIterable(getDatabaseList())
            .subscribeOn(Schedulers.io())
            .flatMap(database -> transformDatabase(database, DB_1_MAPPER))
            .flatMap(NetworkController::updateRemote)
            .toList() // This has type of Single<List<>>
            .flatMap(list -> {
                // Update db1 and db2 with the result of server update.
                return Single.zip(updateDb1(list), updateDb2(list), (a, b) -> {
                    // Combine result of db updates
                });
            })
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(result -> {
                // Handle success case
            }, err -> {
                // Handle error case
            });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-02
      相关资源
      最近更新 更多