[英]onChanged method of livedata observe called multiple times
在我的片段布局文件中,有一個微調器:
<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方法被調用了兩次。 我需要解釋為什么會這樣。
這是因為LiveData
觀察器已在onDestroy()
中刪除。 您應注意,可以多次調用onActivityCreated()
而不調用onDestroy()
。 在這種情況下,每次調用onActivityCreate()
,該片段都會將一個新的觀察者實例附加到LiveData,而不會刪除以前的觀察者。
因此,您必須要么在fragment.onCreate()
觀察LiveData
這實際上並不實際,要么使用getViewLifecycleOwner()
獲得更合理的LifecycleOwner
實例。
例如,在onActivityCreated()
進行觀察的正確方法是:
timeSheetFragViewModel.selectedWeek.observe(getViewLifecycleOwner(), new Observer<Integer>() {
@Override
public void onChanged(@Nullable Integer integer) {
...
}
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.