我在Room库android中使用LiveData时遇到问题。
我有一个片段,其中有一个RecyclerView
,要使用Observer
填充LiveData
mDB.user().getUsers().observe(getViewLifecycleOwner(), new Observer<List<UserModel>>() {
@Override
public void onChanged(List<UserModel> userModels) {
updateUI(userModels);
}
});
如果我点击ADD按钮,调用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"
您应该从UsersFragment
的onResume()
而不是onCreateView()
调用observe()
,因为要添加新用户,您将切换到一个新的"活动",该活动会暂停当前活动及其附加的片段,而不是破坏片段的视图。因此,当您返回到当前活动时,UsersFragment
的onCreateView()
从未被调用,但onResume()
被调用。
然而,我建议您实现一个适当的ViewModel
、Repository
模式来与Room
数据库通信。