Проблема в следующем, я подписался на 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.
Я был бы признателен, если кто-то может помочь с. Спасибо.
@RishabhJain Эта расширенная лямбда disposable.add(userRepository.getUser() .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(value -> userLiveData.setValue(value), Throwable::printStackTrace) );
Вы определили наблюдателя? Где функция onChang? Проверьте это: developer.android.com/topic/libraries/architecture/…
Может одноразовые уже утилизируются? Можете ли вы показать логику удаления для вашего disposable?
Взгляните на абзац «Наблюдать за объектами 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(): устанавливает значение. Если есть активные наблюдатели, значение будет отправлено им. Этот метод должен вызываться из основного потока.
не могли бы вы поделиться своим методом setValue(), пожалуйста