Наблюдатель Android LiveData после onPause

Проблема в следующем, я подписался на 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.

Я был бы признателен, если кто-то может помочь с. Спасибо.

не могли бы вы поделиться своим методом setValue(), пожалуйста

Rishabh Jain 13.06.2019 14:08

@RishabhJain Эта расширенная лямбда disposable.add(userRepository.getUser() .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(value -> userLiveData.setValue(value), Throwable::printStackTrace) );

G_MAN 13.06.2019 14:37

Вы определили наблюдателя? Где функция onChang? Проверьте это: developer.android.com/topic/libraries/architecture/…

Daniel Spiess 13.06.2019 14:47

Может одноразовые уже утилизируются? Можете ли вы показать логику удаления для вашего disposable?

Sanlok Lee 13.06.2019 20:24
1
4
3 290
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Generally, LiveData delivers updates only when data changes, and only to active observers. An exception to this behavior is that observers also receive an update when they change from an inactive to an active state. Furthermore, if the observer changes from inactive to active a second time, it only receives an update if the value has changed since the last time it became active.

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

Спасибо, это ответ. Я изменил метод с setValue на postValue. Проблема была в неправильном методе. setValue(): устанавливает значение. Если есть активные наблюдатели, значение будет отправлено им. Этот метод должен вызываться из основного потока.

G_MAN 26.06.2019 17:20

Другие вопросы по теме