Есть задача, которую мне нужно выполнять каждый раз, когда пользователь приходит к HomeFragment
.Не имеет значения, был ли он вновь создан или пользователь вернулся к этому Fragment
.
. Он прекрасно работает при создании заново, но при возврате из заднего стека наблюдатель не вызывается.С помощью отладчика я обнаружил, что LiveData
имеет Observers, , но hasActiveObservers()
возвращает false .Я пытался манипулировать и наблюдать / удалятьObserver из различных обратных вызовов жизненного цикла, но безуспешно.Не могу найти четкого объяснения и в Google.
Вот мой HomeFragment.java
:
public class HomeFragment extends BaseFragment {
//.......
private ImportViewModel viewModel;
private Observer<State> observer = state -> {
//update UI depending on a state
};
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
viewModel = ViewModelProviders.of(this, viewModelFactory).get(ImportViewModel.class);
observeViewModel();
}
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_home, container, false);
//execute here since onCreate() is not called when coming from backstack
viewModel.importFile();
return v;
}
@Override
public void onDestroy() {
super.onDestroy();
viewModel.liveDataState.removeObserver(observer);
}
private void observeViewModel() {
viewModel.liveDataState.observe(this, observer);
}
//.......
}
И ImportViewModel.java
public class ImportViewModel extends ViewModel {
//......
public MutableLiveData<State> liveDataState = new MutableLiveData<>();
//......
public void importFile(){
disposables.add(repository.importFile()
.subscribeOn(subscribeOnScheduler)
.observeOn(observeOnScheduler)
.subscribe(this::onNext, this::onError, this::onComplete));
}
private void onNext(SomeResponse resp){
liveDataState.setValue(new State(resp));
}
private void onError(Throwable t){
liveDataState.setValue(new ErrorState(t.getMessage()));
}
private void onComplete(){
liveDataState.setValue(new CompleteState());
}
}
Почему Обозреватель становитсянеактивным?