【问题标题】:Android: Infinite loop with LiveData<Boolean>Android:使用 LiveData<Boolean> 进行无限循环
【发布时间】:2021-08-17 05:51:12
【问题描述】:

点击按钮时调用此方法

@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);
            }
        }
    });
}

如果测试对象存在于收藏夹数据库中,我必须将其删除。删除后,它再次调用它(因为它观察到了一个chane)并再次插入它。

它会无限循环。有没有更好的方法来实现或阻止它?

【问题讨论】:

  • 所以你想删除它?或插入它?由于它会检测 db 中的更改,因此您必须选择删除/插入它
  • @Teo 它切换,如果它存在于数据库中,它会删除。如果它不在 DB 中,它会插入。

标签: java android android-room android-livedata


【解决方案1】:

好像有一些业务逻辑进入了你的视图(Activity)类。

由于 LiveData 和 Room 旨在在需要接收有关数据库更改的更新时使用,并且您对数据库的使用不需要不断更新,我建议使用更直接的方法。

首先,从您的数据库中删除对 LiveData 的使用。使用简单的返回值。

然后您的视图(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 可以处理逻辑(或者最好添加一个存储库层 - 请参阅Here

点击后,检查数据库中是否存在条目。
如果存在:将其从数据库中删除并设置 favoriteIcon 值:

favoriteIcon.setValue(R.drawable.non_fav)

如果不存在:将其添加到 DB 并设置 favoriteIcon 值。

favoriteIcon.setValue(R.drawable.fav)

有关使用 Room 和 LiveData 以及使用 View/ViewModel/Repository 模式的优秀教程,请查看this link

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多