是什么触发了 LiveData onChanged()?
What triggers LiveData onChanged()?
我正在使用 Room
并且在 Dao
我有这个方法:
LiveData<List<Books>> getAllBooks();
在 MainActivity 中,我已经从 ViewModel
订阅了该方法。数据更改触发 onChanged()
回调:
viewModel.getAllBooks()
.observe(this, books -> {
Log.d(TAG, "onChanged()");
booksListAdapter.setData(new ArrayList<>(books));
});
我想知道什么是更新?当应用程序首次启动时,我进行了 100 次插入,每次插入都会更改数据库,但 onChanged()
不会被调用 100 次。上次我检查它第一次调用 onChanged()
我认为它总是在启动时调用然后再调用两次。
我可以控制这个吗?例如,如果我知道我将进行 100 次插入,那么如果我只在插入结束时获得回调可能会更好。
你无法控制它。您可以做的是使用 MediatorLiveData
和 post 所有插入后的值。每当您更新、删除或插入时,Room 都知道发生了变化,但不知道发生了什么变化。所以它只是重新查询并将结果发送到观察 LiveData
检查这个 blog,主要是第 7 节。避免针对可观察查询的误报通知。作者给出了很好的 MediatorLiveData
示例,这与您正在寻找的内容相似
我正在使用 Room
并且在 Dao
我有这个方法:
LiveData<List<Books>> getAllBooks();
在 MainActivity 中,我已经从 ViewModel
订阅了该方法。数据更改触发 onChanged()
回调:
viewModel.getAllBooks()
.observe(this, books -> {
Log.d(TAG, "onChanged()");
booksListAdapter.setData(new ArrayList<>(books));
});
我想知道什么是更新?当应用程序首次启动时,我进行了 100 次插入,每次插入都会更改数据库,但 onChanged()
不会被调用 100 次。上次我检查它第一次调用 onChanged()
我认为它总是在启动时调用然后再调用两次。
我可以控制这个吗?例如,如果我知道我将进行 100 次插入,那么如果我只在插入结束时获得回调可能会更好。
你无法控制它。您可以做的是使用 MediatorLiveData
和 post 所有插入后的值。每当您更新、删除或插入时,Room 都知道发生了变化,但不知道发生了什么变化。所以它只是重新查询并将结果发送到观察 LiveData
检查这个 blog,主要是第 7 节。避免针对可观察查询的误报通知。作者给出了很好的 MediatorLiveData
示例,这与您正在寻找的内容相似