LiveData деактивирует наблюдателя во фрагменте после извлечения его из backstack - PullRequest
0 голосов
/ 03 октября 2018

Есть задача, которую мне нужно выполнять каждый раз, когда пользователь приходит к 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());
    }
}

Почему Обозреватель становитсянеактивным?

...