在我的 fragment 布局文件中,我有一个微调器:
<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);
}
在我的 Fragment 中,我将观察者放在 onActivityCreated 中,这样实时数据:
timeSheetFragViewModel.selectedWeek.observe(this, new Observer<Integer>() {
@Override
public void onChanged(@Nullable Integer integer) {
Log.d("DEBUG", "its called");
}
});
当 fragment 第一次加载时,onChanged 方法被调用一次。我认为没关系。但是,当我旋转屏幕时,onChanged 方法调用了两次。我需要解释为什么会这样。
最佳答案
那是因为 LiveData
观察者在 onDestroy()
中被移除了。您应该注意,onActivityCreated()
可以在不调用 onDestroy()
的情况下被多次调用。在这种情况下,每次调用 onActivityCreate()
时, fragment 都会将一个新的观察者实例附加到 LiveData,而不会删除之前的观察者。
因此,您必须在 fragment.onCreate()
中观察 LiveData
——这实际上并不实用,或者使用 getViewLifecycleOwner()
以获得更合理的 LifecycleOwner
实例。
比如在onActivityCreated()
中正确的观察方式是:
timeSheetFragViewModel.selectedWeek.observe(getViewLifecycleOwner(), new Observer<Integer>() {
@Override
public void onChanged(@Nullable Integer integer) {
...
}
});
关于android - 多次调用 livedata observe 的 onChanged 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55705697/