如何在Android应用程序结合起来,RxJava网络和数据库更新

问题描述 投票:0回答:1

我调查我的最新的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调用,虽然执行

我宁愿用SingleObservable我的API调用与Single<Response>回应,但我不能看到如何实现Observable.just(<>)跟单。

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

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

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
投票

1.

我宁愿用单可观察我的API调用与单回应,但我不能看到如何实现Observable.just(<>)跟单。

你可以这样做:

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

然而,Single不适合在这种情况下,因为你不是一个单一的项目工作,你需要什么,而不是通过多个项目和工作,反覆的项目一个接一个。

2.

分别处理每个列表项的网络电话,然后执行数据库的完整列表电话

您可以使用toList()运营商发出商品时,可观察到完成的整个列表。

3.

do运营商如doOnNextdoOnComplete,和doOnError的目的是创建副作用不影响该流。这种操作的一个例子是伐木。你不应该这样做会影响这类运营商的流任何有意义的操作。

相反,你应该使用运营商如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
        });
© www.soinside.com 2019 - 2024. All rights reserved.