java - LiveData 观察者的 onchanged() 方法执行多次
问题描述
我是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。
推荐阅读
- google-cloud-platform - 如何将 SNAPPY 格式的压缩拼花数据从 Google Storage 存储桶加载到 BigQuery 表
- r - R中的日期格式
- sql - 如何从视图中唯一标识表,并将 1:1 和逻辑与视图分开?
- bash - 使用包含 NULL 字符的正则表达式字符范围的 Grep
- kotlin - Unit.INSTANCE 与单位?Unit 编译但有 IDE 错误,Unit.INSTANCE 没有编译但没有 IDE 错误
- r - 整合两个数据框,给出一个位置并在 R 中使用一个区间
- python - 如何在稳定的基线中获得 action_propability() 3
- arrays - ruby - 计算超市排队的时间
- ios - Swift - 使用通用方法实现不同的协议
类型 - python - 如何在不设置重写目标的情况下通过入口访问烧瓶应用程序