我是android开发的新手。目前,我正在使用体系结构组件。当我第一次给片段充气时,Observer onChanged()执行了几次,因此ui中的数据被重复了。但是,当我分离并附加片段时,它工作正常。
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。
关于java - LiveData观察者的onchanged()方法执行多次,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58922370/