簡體   English   中英

LiveData 觀察者的 onchanged() 方法執行多次

[英]LiveData observer's onchanged() method executes several times

我是 android 開發的新手。 目前我正在使用架構組件。 當我第一次為我的片段充氣時,觀察者 onChanged() 執行了幾次,所以我的用戶界面中的數據被重復了。 但是當我分離並附加片段時它工作正常。

MyFragment.java

private MyViewModel myViewModel;

 @Override
 public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup 
 container, @Nullable Bundle savedInstanceState) {
             View rootView =  inflater.inflate(R.layout.my_fragment, container, false);
             return rootView;
    }


   @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        myViewModel = ViewModelProviders.of(this).get(MealViewModel.class);
        myViewModel.getBreakfast(randomNum).observe(getViewLifecycleOwner(), new    Observer<List<BreakFast>>() {

                @Override
                public void onChanged(@Nullable final List<BreakFast> breakFasts) {

                    for (int i = 0; i < breakFasts.size(); i++) {
                        String food = breakFasts.get(i).getFood();
                        if (food.contains("||")) {
                            food = food.replace("||", "\n");
                        }
                        builder.append( food + "\n");
                    }
                    resultTextView.setText(builder.toString());
                }
            });
}

在上面的代碼中,onChanged 方法在視圖第一次膨脹時被執行了很多次。

LiveData 是一種可觀察的類型。 它的工作是在其中托管的數據更新時發布更改(通過手動調用 postValue 或在添加新數據時自動)

如果您只想獲取一次數據,那么 LiveData 不適合您。 您可以簡單地使用Single來實現這一點。

您可以做的另一件事是 - 當它們通過您的 onChanged() 方法第二次推送給您時,只需忽略更改。 我的意思是,不要第二次更新你的文本視圖。 但是,您確實應該有一個足夠清晰的分離邏輯,以區分您將使用的回調和您不會使用的其他回調。

我能想到的最后一件事是刪除觀察者 - 一旦您觀察到更改一次,您當前的生命周期所有者(活動或片段)。 通過在 LiveData 上調用 removeObserver() 方法。

PS:所有這些都只是解決方法。 如果您不想開始對數據進行實時更改,那么您真的應該重新考慮使用 LiveData。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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