LiveData,注册观察者时如何避免第一次回调

kel*_*elo 5 android fragment android-livedata android-viewmodel

我想在片段中加载任务,在片段的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();
}
Run Code Online (Sandbox Code Playgroud)

kel*_*elo 3

我找到了一个简单的解决方案,在加载之前检查 livedata 值

@Override
public void onResume() {
    super.onResume();
    if (mainViewModel.increaseTaskList.getValue()==null) {
        Log.d("ZZZ","IncreaseFragment loadTaskAsync");
        mainViewModel.loadIncreasePointTaskList();
    }
}
Run Code Online (Sandbox Code Playgroud)