android - 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();
}
解决方案
只要内容没有更改,您就可以使用SingleLiveEvent
不会触发的。
不过,这是 Google 推荐的。
推荐阅读
- python - 如何在没有 Python 的情况下读取 .py
- python - Xlsxwriter 用包含多个单词的工作表名称和将数字作为文本写入 excel 来绘制奇怪的行为
- c++ - 类中的公共数据成员
- java - 无法在 TextView 上设置文本。给出 NullPointerException
- kubernetes - 如何让 My First ingress 在裸机 NodeIP 上运行?
- arrays - 使用反应钩子和受控组件更改获取的列表数组的值
- google-sheets - 如何使用查询根据谷歌表中的某些条件过滤数据
- python - 使用属性装饰器时,类对象同时包含 _和属性
- spring-boot - 如果我们在 K8s 中部署应用程序时使用 Eureka Discovery、Ribbon 等 Spring Cloud,何时使用?
- r - 使用深度网络和 R 中的 MNIST 数据读取手写数字序列 - 第 1 部分