【问题标题】:Android Architecture Components how to combine LiveData from both database and network?Android架构组件如何结合来自数据库和网络的LiveData?
【发布时间】:2017-11-03 08:23:01
【问题描述】:
NetworkBoundResource 中提供了一个示例,但是当我尝试时,如果数据库返回结果,则不再从网络获取。我想要的是同时显示来自数据库的数据并触发网络,并最终在网络完成后替换数据库中的数据。示例代码将不胜感激。
【问题讨论】:
标签:
android
mvvm
architecture
android-architecture-components
android-livedata
【解决方案1】:
我会使用房间数据库将您的项目保存在表格中。然后你使用 Paging list 来观察那个表。您第一次观察该表时,也要向网络发出请求。当您收到响应时,从表中删除所有项目并插入新项目(所有这些都在存储库类和后台线程中)。这最后一步将在您的寻呼列表观察该房间表时自动更新您的寻呼列表。
【解决方案2】:
猜这篇文章可能会有所帮助:
https://proandroiddev.com/the-missing-google-sample-of-android-architecture-components-guide-c7d6e7306b8f
以及本文的 GitHub 存储库:
https://github.com/PhilippeBoisney/GithubArchitectureComponents
此解决方案的核心是 UserRepository:
public LiveData<User> getUser(String userLogin) {
refreshUser(userLogin); // try to refresh data if possible from Github Api
return userDao.load(userLogin); // return a LiveData directly from the database.
}
// ---
private void refreshUser(final String userLogin) {
executor.execute(() -> {
// Check if user was fetched recently
boolean userExists = (userDao.hasUser(userLogin, getMaxRefreshTime(new Date())) != null);
// If user have to be updated
if (!userExists) {
webservice.getUser(userLogin).enqueue(new Callback<User>() {
@Override
public void onResponse(Call<User> call, Response<User> response) {
Toast.makeText(App.context, "Data refreshed from network !", Toast.LENGTH_LONG).show();
executor.execute(() -> {
User user = response.body();
user.setLastRefresh(new Date());
userDao.save(user);
});
}
@Override
public void onFailure(Call<User> call, Throwable t) { }
});
}
});
}