Я реализую проект 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 получает уведомление только один раз... есть ли несоответствие между запросами и изменением живые данные? Я что-то не так понял, или есть лучший способ реализовать это?
peopleResponseMutableLiveData.postValue(response.body());
вызывается 9 раз или только один раз? - person Rajat Beck   schedule 01.07.2020PeopleResponse
объект имеет одни и те же данные для всех 9 вызовов, или вам может потребоваться переопределить метод equals и hashcode для вашего классаPeopleResponse
, поскольку Live Data не может различать два разных объекта одного типа. - person Rajat Beck   schedule 01.07.2020.observe()
каждый из них при итерации... Я не знаю, чего вы пытаетесь достичь, ноMediatorLiveData
разрешает слияние, так как мне интересно, почему вы вообще запрашиваете 9 раз. - person Martin Zeitler   schedule 01.07.2020peekContent()
, чтобы увидеть, возможно, он уже был обработан. - person Martin Zeitler   schedule 01.07.2020