Метод onChanged liveata, наблюдаемый несколько раз - PullRequest
1 голос
/ 16 апреля 2019

В моем файле макета фрагмента у меня есть счетчик:

                <android.support.v7.widget.AppCompatSpinner
                android:id="@+id/sp_week"
                android:layout_width="150dp"
                android:layout_height="50dp"
                android:entries="@array/week"
                android:paddingLeft="20dp"
                android:selectedItemPosition="@={TimeSheetFragViewModel.selectedWeek}">

И в классе TimeSheetFragViewModel я объявил selectedWeek следующим образом:

    public MutableLiveData<Integer> selectedWeek = new MutableLiveData<>();

public int getSelectedWeek() {

    if(selectedWeek.getValue() == null) return 0;
    return selectedWeek.getValue();
}

public void setSelectedWeek(int value) {
    selectedWeek.setValue(value);
}

В My Fragment я поместил наблюдателя в onActivityCreated для таких живых данных, как это:

       timeSheetFragViewModel.selectedWeek.observe(this, new Observer<Integer>() {
        @Override
        public void onChanged(@Nullable Integer integer) {

            Log.d("DEBUG", "its called");

        }
    });

когда фрагмент загружается впервые, метод onChanged вызывается один раз. Что я думаю, это нормально. Однако, когда я поворачиваю экран, метод onChanged вызывается два раза. Мне нужно объяснение, почему это происходит.

1 Ответ

0 голосов
/ 30 апреля 2019

Это потому, что LiveData наблюдатели удалены в onDestroy(). Следует отметить, что onActivityCreated() можно вызывать несколько раз без вызова onDestroy(). В этом сценарии каждый раз, когда вызывается onActivityCreate(), фрагмент прикрепляет новый экземпляр наблюдателя к LiveData без удаления предыдущих наблюдателей.

Следовательно, вы должны либо наблюдать LiveData в fragment.onCreate() - что на самом деле не практично, либо использовать getViewLifecycleOwner(), чтобы получить более разумный LifecycleOwner экземпляр.

Например, правильный способ наблюдения в onActivityCreated():

timeSheetFragViewModel.selectedWeek.observe(getViewLifecycleOwner(), new Observer<Integer>() {
    @Override
    public void onChanged(@Nullable Integer integer) {
        ...
    }
});
...