【问题标题】:Room android LiveData observe call only 2 timesRoom android LiveData 仅观察调用 2 次
【发布时间】:2020-03-22 11:52:48
【问题描述】:

我在 Room library android 中使用 LiveData 时遇到问题。

我有一个片段,其中有一个RecyclerView 并使用LiveData 填充Observer

mDB.user().getUsers().observe(getViewLifecycleOwner(), new Observer<List<UserModel>>() {
        @Override
        public void onChanged(List<UserModel> userModels) {
            updateUI(userModels);
        }
});

如果我点击添加按钮,调用startActivity,用我的表单打开一个新活动,编译所有字段和@INSERT DB 上的一个新项目

AsyncTask.execute(() -> {
        mDB.user().addUser("NAME");
        finish();
});

当完成当前活动时,再次显示之前的片段并自动调用onChangedobserve 只被调用了 2 次,如果我点击 ADD 按钮(第 3 次)并返回片段,则永远不会调用并且永远不会刷新我的列表。 我不知道为什么。

我尝试使用 observeForever 没有结果。

我在调试中看到,从未调用过removeObserver,因此观察者处于活动状态。

这些是我的依赖项

def room_version = "2.2.5"
def lifecycle_version = "2.3.0-alpha01"

// Room database
implementation "androidx.room:room-runtime:$room_version"
annotationProcessor "androidx.room:room-compiler:$room_version"
// ViewModel
implementation "androidx.lifecycle:lifecycle-viewmodel:$lifecycle_version"
// LiveData
implementation "androidx.lifecycle:lifecycle-livedata:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-service:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-process:$lifecycle_version"

【问题讨论】:

  • 您在 Fragment 的哪个方法中调用 LiveData.observe()?
  • 在onCreateView中,但我也尝试过onCreate
  • 所以对于前两个插入,它会更新 UI,但在第三个之后,它不会?
  • 是的,完全正确。 1 - 单击添加...编译,调用 INSERT,完成() -> 在片段中观察者更新 UI 2 - 单击添加...编译,调用插入,完成() -> 在片段中观察者更新 UI 3 -单击添加...编译,调用 INSERT,完成()-> 在片段中观察者不更新 UI
  • 您可能还想分享添加按钮的 onClick() 方法和 updateUI() 方法。

标签: android android-room android-livedata


【解决方案1】:

您应该从onResume()UsersFragment 调用observe(),而不是onCreateView(),因为要添加新用户,您将切换到暂停当前活动和附加到它的片段的新活动,而不是破坏碎片的观点。因此,当您回到当前活动时,UsersFragment 中的 onCreateView() 永远不会被调用,但会调用 onResume()

不过,我建议您实现适当的 ViewModelRepository 模式来与 Room 数据库进行通信。

【讨论】:

  • observe() 无法调用onResume(),因为我只需要调用onCreateView() 1 次。如果打电话给onResume(),每次我从活动回来时都会打电话。问题是在我的 BaseFragment 和 BaseActvity 中,onDestroy() 设置了 Room instance = null。删除这个,现在一切正常。
  • 你可以像if (!mDB.user().getUsers().hasObservers()) {// Attach observer}那样做。
  • 使用viewLifecycleOwner 作为生命周期所有者怎么样?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-22
  • 1970-01-01
相关资源
最近更新 更多