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