繁体   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