首页 > 解决方案 > LiveData,注册观察者时如何避免第一次回调

问题描述

我想在片段中加载任务,在片段的onViewCreated中,我注册LiveData观察者,在片段的onResume中,我异步加载任务,当第一次进入片段时,它工作正常,但是当我导航到其他片段然后回到任务片段,回调onChanged()将被调用两次。

我知道如果LiveData已经有数据集,它会传递给观察者,所以当回到任务片段时,onChanged将在注册观察者时触发onViewCreated,而在onResume中,将触发onChanged第二次,我想知道如何避免这种情况。查了很多,知道有一个EventWrapper,可以标记onChanged第一次触发时消耗的内容。但我认为这种方法太重了。对不起我的英语不好...

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle 
   savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    //...
    mainViewModel = ViewModelProviders.of(getActivity()).get(MainViewModel.class);
    mainViewModel.increaseTaskList.observe(getViewLifecycleOwner(), new 
    Observer<List<Task>>() {
        @Override
        public void onChanged(@Nullable List<Task> tasks) {
            Log.d("ZZZ","data changed,IncreaseTaskListAdapter setData");
            adapter.setData(tasks);
        }
    });
}

@Override
public void onResume() {
    super.onResume();
    mainViewModel.loadIncreasePointTaskList();
}

标签: androidfragmentandroid-livedataandroid-viewmodel

解决方案


只要内容没有更改,您就可以使用SingleLiveEvent不会触发的。

不过,这是 Google 推荐的。


推荐阅读