我在我的Android项目中使用RxJava,我很高兴。我目前正在使用它来使所有DAO方法异步并使UI监听它们。
但是我有一个很大的问题,就是当我使用Observable<List<User>> getLists()
从数据库中检索一些数据时,我需要在我的ViewModel中使用List<User>
,但我无法从observable中提取它。
我想知道解决这类问题的常用方法是什么?我在互联网上搜索,人们说不建议提取对象,但在这种情况下,我如何使用数据库中的数据,同时仍然使观察者能够收听?
我应该使用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());
反应性扩展的核心思想是利用事件的流观察和及时处理。
实际上,如果你需要以简单的方式检索数据,我会说你根本不需要RxJava2。但是,如果您想坚持使用被动方法,则应该收听数据流。
所有RxJava2类型都提供了一个subscribe
方法,该方法“通知”本质上是懒惰的数据源,这是一个想要接收数据的观察者,因此使用RxJava2运算符描述的所有数据处理流程都将变为活动状态。
最无痛的方法是将HomeActivity's
代码更改为:
vm.getUsers()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(userListAdapter::populateWithNewDataSet);
,假设适配器将具有所提到的方法,该方法将在内部使用notifyDataSetChanged()
(或DiffUtil
)之类的内容更新UI数据集。
通过这样做,现在可以观察数据源,并且每次发布更新时,UI将使用最新数据重新填充。
P.S。:我刚刚演示了最简单的方法,但是开发人员可以放置与RxJava相关的代码:无论是ViewModel
,Activity
,还是其他一些组件。 RxJava是一个使用方便的工具,它可以简化复杂的异步流程,但是当所有代码库都依赖于它时,RxJava就会出现问题。如果工具在不适当的地方使用,代码库很快就会变得难以管理,脆弱和僵硬。
添加@AndreyIlyunin非常好的答案,您还可以在Viewmodel中使用MutableLivedata将Viewmodel中的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。