簡體   English   中英

liveData的onChanged方法觀察多次調用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM