RxJava Модифицированная цепочка запросов с циклом foreach - PullRequest
0 голосов
/ 25 июня 2019

Я пытаюсь перейти от использования обычного Retrofit к использованию расширения RxJava для модернизации, чтобы выполнить цепочку вызовов API в фоновом потоке.

Например, у меня есть объект с именем ModelGroup, который имеетсписок объектов ModelPerson.Моя цель состоит в том, чтобы сделать следующее.

  1. Отправьте ModelGroup на сервер и получите ответ, представляющий собой целое число, представляющее вновь вставленный идентификатор, назовем его newGroupId.
  2. ДляДля каждого ModelPerson в ModelGroup задайте для Person.groupId значение newGroupId.
  3. Отправлять каждого сотрудника на сервер.
  4. Если все объекты ModelPerson из ModelGroup были успешно обновлены с помощью 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?

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

1 Ответ

1 голос
/ 27 июня 2019

Прежде всего, вам необходимо изменить компоненты Retrofit для использования 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());
}
...