Android с проблемой retrofit2 и MutableLiveData при выполнении нескольких вызовов запросов (MVVM)

Я реализую проект Android, в котором я настраиваю службу для подключения к API звездных войн и запрашиваю у нее несколько символов. Я использую архитектуру MVVM. Я делаю запросы через метод searchCharacters:

    public void searchCharacters(int queryPage) {
    Map<String, String> queryData = new HashMap<>();
    queryData.put("page", String.valueOf(queryPage));
    starWarsClient.createStarWarsService().getPeople(queryData).enqueue(new Callback<PeopleResponse>() {
        @Override
        public void onResponse(Call<PeopleResponse> call, Response<PeopleResponse> response) {
            Log.d("RESPONSE BODY", "CHARACTERS OF PAGE : " + String.valueOf(queryPage));
            if (response.body().getResults() != null) {
                List<Character> characters = response.body().getResults();
                if (response.body() != null) {
                    peopleResponseMutableLiveData.postValue(response.body());
                }
            }
        }

        @Override
        public void onFailure(Call<PeopleResponse> call, Throwable t) {
            peopleResponseMutableLiveData.postValue(null);

        }
    });

На characterFragment (который устанавливает characterAdapter) и визуализирует полученные данные, я наблюдаю за liveData модели представления и прослушиваю изменения данных с помощью метода onChanged():

        //intiialize the characterViewModel and connect the Live Data to the fragment
    characterSearchViewModel = ViewModelProviders.of(this).get(CharacterSearchViewModel.class);
    characterSearchViewModel.init();
    characterSearchViewModel.searchCharacters(1);
    characterSearchViewModel.searchCharacters(2);
    characterSearchViewModel.searchCharacters(3);
    characterSearchViewModel.searchCharacters(4);
    characterSearchViewModel.searchCharacters(5);
    characterSearchViewModel.searchCharacters(6);
    characterSearchViewModel.searchCharacters(7);
    characterSearchViewModel.searchCharacters(8);
    characterSearchViewModel.searchCharacters(9);
    characterSearchViewModel.getPeopleResponseLiveData().observe(this, new Observer<PeopleResponse>() {
                @Override
                public void onChanged(PeopleResponse peopleResponse) {
                    if (peopleResponse != null) {
                        if (peopleResponse.getPrevious() != null) {
                            Log.d("LIVE DATA CHANGED", " change of live data");
                        }
                        returnedCharacters = peopleResponse.getResults();
                        for (int i = 0; i < returnedCharacters.size(); i++)
                        {
                            AllCharacters.add(returnedCharacters.get(i));
                        }
                        //sort all characters before presenting them
                        Collections.sort(AllCharacters, new Comparator<Character>() {
                            @Override
                            public int compare(Character character, Character t1) {
                                return character.getName().compareTo(t1.getName());
                            }
                        });
                        charactersAdapter.setResults(AllCharacters);
                                        setRecyclerAdapter(AllCharacters);
                    }
                }
            });

Проблема в том, что я получаю тела ответов всех 9 запросов (для каждой символьной страницы API), в то время как метод onChanged Observer получает уведомление только один раз... есть ли несоответствие между запросами и изменением живые данные? Я что-то не так понял, или есть лучший способ реализовать это?


person Lampros Marantos    schedule 01.07.2020    source источник
comment
Вы проверили с помощью отладчика, что ваш peopleResponseMutableLiveData.postValue(response.body()); вызывается 9 раз или только один раз?   -  person Rajat Beck    schedule 01.07.2020
comment
Да и вызывается он 9 раз...   -  person Lampros Marantos    schedule 01.07.2020
comment
метод наблюдения живых данных вызывается только при изменении данных, причина, по которой наблюдатель не вызывается несколько раз, возможно, из-за того, что PeopleResponse объект имеет одни и те же данные для всех 9 вызовов, или вам может потребоваться переопределить метод equals и hashcode для вашего класса PeopleResponse, поскольку Live Data не может различать два разных объекта одного типа.   -  person Rajat Beck    schedule 01.07.2020
comment
Просто добавьте их в цикл и .observe() каждый из них при итерации... Я не знаю, чего вы пытаетесь достичь, но MediatorLiveData разрешает слияние, так как мне интересно, почему вы вообще запрашиваете 9 раз.   -  person Martin Zeitler    schedule 01.07.2020
comment
Или попробуйте переопределить peekContent(), чтобы увидеть, возможно, он уже был обработан.   -  person Martin Zeitler    schedule 01.07.2020
comment
Поскольку я использую post(Value) для 9 разных запросов (с разными телами ответов), не должна ли программа вызывать метод onChanged() одинаковое количество раз?   -  person Lampros Marantos    schedule 01.07.2020
comment
@MartinZeitler Я запрашиваю 9 разных страниц API, поэтому я добавляю разные параметры страницы в метод вызова модифицированного API.   -  person Lampros Marantos    schedule 01.07.2020