代码之家  ›  专栏  ›  技术社区  ›  Hector

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

  •  0
  • Hector  · 技术社区  · 6 年前

    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();
    

    我宁愿使用 Single 那个 Observable Single<Response> ,但我看不出如何实现可观察性。只需(<>)使用单个。

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

    这在一个接收过程“流”中是否可能?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Sanlok Lee    6 年前

    1.

    您可以这样做:

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

    然而 Single 在这种情况下不适用,因为您没有使用 项目,而您需要的是迭代 倍数


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

    你可以用 toList() 运算符,当可观察对象完成时,它将发出整个项目列表。


    3.

    do doOnNext , doOnComplete doOnError 是为了产生不影响流的副作用。这种操作的一个例子是日志记录。您不应该在此类运算符中执行任何影响流的有意义的操作。

    map , flatMap


    把所有东西放在一起:

    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
            });