【发布时间】:2017-10-27 13:09:56
【问题描述】:
最近我正在探索谷歌最近推出的 Android 架构。从Documentation 我发现了这个:
public class MyViewModel extends ViewModel {
private MutableLiveData<List<User>> users;
public LiveData<List<User>> getUsers() {
if (users == null) {
users = new MutableLiveData<List<Users>>();
loadUsers();
}
return users;
}
private void loadUsers() {
// do async operation to fetch users
}
}
活动可以按如下方式访问此列表:
public class MyActivity extends AppCompatActivity {
public void onCreate(Bundle savedInstanceState) {
MyViewModel model = ViewModelProviders.of(this).get(MyViewModel.class);
model.getUsers().observe(this, users -> {
// update UI
});
}
}
我的问题是,我要这样做:
在
loadUsers()函数中,我异步获取数据,我将首先检查数据库(房间)中的数据如果我没有在那里获取数据,我将调用 API 从 Web 服务器获取数据。
我会将获取的数据插入数据库(房间)并根据数据更新 UI。
推荐的方法是什么?
如果我启动 Service 以从 loadUsers() 方法调用 API,我如何从 Service 更新 MutableLiveData<List<User>> users 变量?
【问题讨论】:
-
首先,您缺少一个存储库。您的 ViewModel 不应执行任何数据加载任务。除此之外,由于您使用 Room,您的服务不必直接更新 ViewModel 中的 LiveData。 Service 只能将数据插入 Room,而您的 ViewModelData 应该只附加到 Room,并从 Room 获取更新(在 Service 插入数据之后)。但是对于绝对最佳的架构,请查看本页底部的 NetworkBoundResource 类实现:developer.android.com/topic/libraries/architecture/guide.html
-
谢谢你的建议:)
-
Repositor 类在描述 ROOM 或 android 架构组件的官方文档中未提及
-
Repository 是代码分离和架构的建议最佳实践,看这个例子:codelabs.developers.google.com/codelabs/…
-
函数
loadUsers()基本上会调用repo获取用户信息
标签: android viewmodel background-service android-room android-architecture-components