RxJava:解压缩对象

时间:2019-04-29 15:59:19

标签: android rx-java2

我在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());

2 个答案:

答案 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相关的代码:ViewModelActivity,甚至是一些其他组件。 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。