liveData的onChanged方法观察多次调用

时间:2019-04-16 10:10:34

标签: android mvvm android-livedata android-viewmodel

在我的片段布局文件中,有一个微调器:

                <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);
}

在“我的片段”中,我将观察者放在onActivityCreated中,用于这样的实时数据:

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

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

        }
    });

第一次加载片段时,调用onChanged方法一次。我认为还可以。但是,当我旋转屏幕时,onChanged方法被调用了两次。我需要解释为什么会这样。

1 个答案:

答案 0 :(得分:0)

这是因为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) {
        ...
    }
});