java - RxJava 使用 foreach 循环改造请求链

标签 java android retrofit rx-java rx-java2

我正在尝试从使用普通的 Retrofit 迁移到使用 RxJava 扩展进行改造,以便在后台线程上进行 API 调用链。

例如,我有一个名为 ModelGroup 的对象,其中包含 ModelPerson 对象的列表。我的目标是执行以下操作。

  1. 发送ModelGroup到服务器并接收响应,响应是一个整数,代表新插入的ID,我们称之为newGroupId。
  2. 对于 ModelGroup 中的每个 ModelPerson,将 Person.groupId 设置为 newGroupId。
  3. 将每个人发送到服务器。
  4. 如果 ModelGroup 中的所有 ModelPerson 对象均已使用 newGroupId 成功更新,则响应 onSuccess,否则响应 onError。

我当前的解决方案如下所示。

private void makeGroupInsert(ModelGroup modelGroup) {

    int newGroupId = myApi.insertNewGroup(modelGroup.getName(), modelGroup.getRating())
            .execute()
            .body();

    for (ModelPerson person : modelGroup.getPersons()) {
        person.setGroupId(newGroupId);

        String response = myApi.insertNewPerson(
                person.getGroup_id(),
                person.getFirst_Name(),
                person.getLast_Name())
                .execute()
                .body();

        if (!response.equals("success")) {
            // One failed to update, send error to main thread.
        }
    }

    // All succeeded, send success back to main thread.
}

问题

如何使用 RxJava + Retrofit 解决方案实现相同(或更好)的功能?

编辑 1

MyApi 定义如下。

public interface MyApi {

    @POST("insert_new_group")
    Call<Integer> insertNewGroup(@Query("group_name") String groupName,
                                   @Query("group_rating") int rating);

    @POST("insert_new_person")
    Call<String> insertNewPerson(@Query("group_id") int groupId,
                                   @Query("first_name") String firstName,
                                   @Query("last_name") String lastName);
}

最佳答案

首先,您需要更改 Retrofit beans 以使用 Observables。例如,它可能类似于以下行:

@POST("insert_new_group")
Observable<Integer> insertNewGroup(...

然后你可以链接请求:

void updateData() {
    myApi.insertNewGroup(modelGroup.getName(), modelGroup.getRating()) //Creating new group and getting its ID
            .switchMap(this::setGroupIdAll) //Calling observable that will loop thru all persons and set their groupIDs
            .subscribe(
                    (n) -> {/*you will get String after every 'insertNewPerson' run*/},
                    (e) -> {/*error handling*/}
            );

}

Observable<String> setGroupIdAll(Integer id) {
    return Observable.fromIterable(personsIterable) //personsIterable contains all your ModelPerson objects
            .flatMap(this::updatePerson); //Call Observabl;e that will send updated person to the server
}

Observable<String> updatePerson(ModelPerson person) {
    return myApi.insertNewPerson(
            person.getGroup_id(),
            person.getFirst_Name(),
            person.getLast_Name());
}

关于java - RxJava 使用 foreach 循环改造请求链,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56757374/

相关文章:

java - 在 eclipse 中创建一个 android DialogFragment

android - 房间迁移 - 将 INTEGER 列类型更改为可为空 (SQLITE)

android - 改造无法访问 HttpUrl

java - CodingBat split53;对使用返回的正确方法感到困惑

java - spring:一个接收类列表的bean

java - 如何随机化游戏的问题和答案?

android - 改造参数为空到服务器

java - 如何在用户输入新行时添加项目符号

java - 使用 GCM 读取更新的注册 ID

Android OAuth 改造访问 token 请求