如何在Android应用程序中结合RxJava中的网络和数据库更新

如何在Android应用程序中结合RxJava中的网络和数据库更新,android,rx-java2,Android,Rx Java2,我正在调查RxJava在我最新的Android应用程序中的使用情况 我有两个相关更新的数据库模型对象列表 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.

我正在调查RxJava在我最新的Android应用程序中的使用情况

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

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,因为我的API调用响应Single,但是我看不到如何实现可观察性。仅使用Single

此外,我无法看到如何通过分别处理网络调用的每个列表项,然后使用完整的列表执行数据库调用来开始我的接收过程,因为我使用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工艺流中是否可行?

1

我宁愿使用Single,因为我的API调用响应Single,但是我看不到如何实现可观察性。仅使用Single

您可以这样做:

Single.just(getDatabaseList()) // Single<>
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
        });