【发布时间】: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();
});
当完成当前活动时,再次显示之前的片段并自动调用onChanged。 observe 只被调用了 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