Android LiveData Observer после включения - PullRequest
0 голосов
/ 13 июня 2019

Проблема в следующем, я подписался на LiveData изменения в активности, и в первый раз я получаю все данные в наблюдателе, но когда я запускаю другое действие и затем возвращаюсь к нему, наблюдатель не вызывается.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    viewModel = ViewModelProviders.of(this, viewModelFactory).get(MainMenuViewModel.class);

    observeViewModel();
}

@Override
protected void onResume() {
    super.onResume();

    viewModel.loadUserEntry();
}


public void observeViewModel() {

    viewModel.getUser().observe(this, userEntry -> {

        // Do some code 
    });
}

вот код моей ViewModel

void loadUserEntry() {

    disposable.add(userRepository.getUser()
            .subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(user::setValue, Throwable::printStackTrace));

}

public LiveData<UserEntry> getUser() {
    return user;
}

Итак, я протестировал, и все время в подписке у меня есть пользовательское значение, а затем я устанавливаю это значение в LiveData.

Буду признателен за помощь. Благодаря.

1 Ответ

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

Взгляните на параграф «Наблюдать за объектами LiveData» :

Обычно LiveData доставляет обновления только при изменении данных и только для активных наблюдателей.Исключением из этого поведения является то, что наблюдатели также получают обновление, когда они переходят из неактивного в активное состояние.Кроме того, если наблюдатель изменяется с неактивного на активный второй раз, он получает обновление только в том случае, если значение изменилось с момента последнего активирования.

I, в вашем случае viewmodel живет так же долготак как активность в спине.Это приводит к LiveData хранению экземпляра UserEntry, и когда вы возвращаетесь к этому действию и вызываете loadUserEntry(), он загружает равный (или даже тот же) экземпляр UserEntry.Загруженный экземпляр равен предыдущему -> LiveData не возвращает его.

...