我在Android项目中使用RxJava,对此我感到很高兴。我目前正在使用它来使我所有的DAO方法异步,并使UI监听它们。
但是我有一个大问题,那就是当我使用Observable<List<User>> getLists()
从数据库中检索某些数据时,我需要在ViewModels中使用List<User>
,但是我无法从可观察对象中提取它。 / p>
我想知道解决这种问题的常用方法是什么?我在Internet上搜索时,人们说不建议提取对象,但是在这种情况下,我如何使用数据库中的数据,同时仍然可以让观察者收听?
我应该使用AsyncTask创建另一个方法吗?
谢谢。
在我的UserRepo.java
中public Observable<List<User>> getUsers() {
return colisDao.getUsers();
}
在HomeScreenViewModel.java中:
public List<User> getUsers() {
return userRepo.getUsers(); // do not work because I need a List<User>
}
在HomeActivity.java中:
UserListAdapter userListAdapter = new UserListAdapter(this,
vm.getUsers());
答案 0 :(得分:3)
反应式扩展的中心思想是利用事件的流观察和及时处理。
因此,实际上,如果您需要以简单的方式检索数据,我会说您根本不需要RxJava2。不过,如果您要坚持采用被动式方法,则应该监听该数据流。
所有RxJava2类型都提供一个subscribe
方法,该方法“通知”本质上是惰性的数据源,这里是一个想要接收数据的观察者,因此所有使用RxJava2运算符描述的数据处理流程会活着。
最轻松的方法是将HomeActivity's
代码更改为此:
vm.getUsers()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(userListAdapter::populateWithNewDataSet);
,假设适配器将具有上述方法,该方法将在内部使用诸如notifyDataSetChanged()
(例如DiffUtil
)之类的东西来更新UI数据集。
这样做可以观察到数据源,并且每次发出更新时,UI都会重新填充最新数据。
PS:我刚刚演示了最简单的方法,但是由开发人员决定放置与RxJava相关的代码:ViewModel
,Activity
,甚至是一些其他组件。 RxJava是一种方便使用的工具,它可以简化复杂的异步流程,但是当所有代码库都依赖RxJava时,就会出现RxJava的问题。如果在不适当的地方使用该工具,那么代码库很快就会变得难以管理,脆弱和僵化。
答案 1 :(得分:1)
在@AndreyIlyunin上添加一个很好的答案,您还可以在Viewmodel中使用MutableLivedata将List中的List保存为Livedata,并在Activity中观察对其的更改。 Google建议将此作为维护MVVM体系结构的方法。像这样:
在HomeScreenViewModel.java中:
private final MutableLivedata<List<User>> users = new MutableLivedata<>();
public void getUsers() {
return userRepo.getUsers()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(this::onUsers)
}
private void onUsers(List<> list){
users.setValue(list);
}
public MutableLivedata<List<User>> getUserList(){
return users;
}
在HomeActivity.java中的onCreate()中添加: vm.getUserList()。observe(this,this :: onUserList);
并将以下方法添加到活动中:
private void onUserList(List<> list){
userListAdapter = new UserListAdapter(this,list);
}
,然后通过您的活动调用:
vm.getUsers();
getUsers()调用在后台异步进行,您可以重新激活userList。