Android:使用 LiveData 无限循环<Boolean>
Android: Infinite loop with LiveData<Boolean>
单击按钮时调用此方法
@Override
public void onFavoriteIconClicked() {
viewModel.isFavoriteExist(test.getId()).observe(getViewLifecycleOwner(), new Observer<Boolean>() {
@Override
public void onChanged(Boolean aBoolean) {
viewModel.isFavoriteExist(test.getId()).removeObserver(this);
if (aBoolean) {
binding.addToFavorite.setImageResource(R.drawable.non_fav);
viewModel.delete(test);
} else if (getActivity() != null) {
Test test2 = new Test(test.getId(), test.getName());
viewModel.insert(test2);
binding.addToFavorite.setImageResource(R.drawable.fav);
}
}
});
}
如果收藏夹数据库中存在测试 object,我必须将其删除。删除后,它再次调用它(因为它观察到一个变化)并再次插入它。
一直在无限循环。有没有更好的方法来实现或阻止它?
似乎有些业务逻辑进入了您的视野(Activity)class.
由于 LiveData 和 Room 的目的是在需要接收有关数据库更改的更新时使用,并且您对数据库的使用不需要不断更新,因此我建议采用更直接的方法。
首先,从您的数据库中删除对 LiveData 的使用。使用简单的 return 值。
您的视图 (Activity/Fragment) 然后可以告诉视图模型单击了一个按钮。
@Override
public void onFavoriteIconClicked() {
viewModel.onFavoriteClicked()
}
视图将观察视图模型以接收要显示的正确图标。
类似于:
viewModel.favoriteIcon.observe(getViewLifecycleOwner(), new Observer<Integer>() {
@Override
public void onChanged(Integer iconResId) {
binding.addToFavorite.setImageResource(iconResId)
}
}
现在 viewModel 可以处理逻辑(或者更好地添加一个 Repository 层 - 请参阅 Here)
单击后,检查数据库中是否存在条目。
如果存在:将其从数据库中删除并设置 favoriteIcon 值:
favoriteIcon.setValue(R.drawable.non_fav)
如果不存在:将其添加到数据库并设置 favoriteIcon 值。
favoriteIcon.setValue(R.drawable.fav)
有关使用 Room 和 LiveData 以及使用 View/ViewModel/Repository 模式的优秀教程,请查看 this link
单击按钮时调用此方法
@Override
public void onFavoriteIconClicked() {
viewModel.isFavoriteExist(test.getId()).observe(getViewLifecycleOwner(), new Observer<Boolean>() {
@Override
public void onChanged(Boolean aBoolean) {
viewModel.isFavoriteExist(test.getId()).removeObserver(this);
if (aBoolean) {
binding.addToFavorite.setImageResource(R.drawable.non_fav);
viewModel.delete(test);
} else if (getActivity() != null) {
Test test2 = new Test(test.getId(), test.getName());
viewModel.insert(test2);
binding.addToFavorite.setImageResource(R.drawable.fav);
}
}
});
}
如果收藏夹数据库中存在测试 object,我必须将其删除。删除后,它再次调用它(因为它观察到一个变化)并再次插入它。
一直在无限循环。有没有更好的方法来实现或阻止它?
似乎有些业务逻辑进入了您的视野(Activity)class.
由于 LiveData 和 Room 的目的是在需要接收有关数据库更改的更新时使用,并且您对数据库的使用不需要不断更新,因此我建议采用更直接的方法。
首先,从您的数据库中删除对 LiveData 的使用。使用简单的 return 值。
您的视图 (Activity/Fragment) 然后可以告诉视图模型单击了一个按钮。
@Override
public void onFavoriteIconClicked() {
viewModel.onFavoriteClicked()
}
视图将观察视图模型以接收要显示的正确图标。
类似于:
viewModel.favoriteIcon.observe(getViewLifecycleOwner(), new Observer<Integer>() {
@Override
public void onChanged(Integer iconResId) {
binding.addToFavorite.setImageResource(iconResId)
}
}
现在 viewModel 可以处理逻辑(或者更好地添加一个 Repository 层 - 请参阅 Here)
单击后,检查数据库中是否存在条目。
如果存在:将其从数据库中删除并设置 favoriteIcon 值:
favoriteIcon.setValue(R.drawable.non_fav)
如果不存在:将其添加到数据库并设置 favoriteIcon 值。
favoriteIcon.setValue(R.drawable.fav)
有关使用 Room 和 LiveData 以及使用 View/ViewModel/Repository 模式的优秀教程,请查看 this link