RxJava:解包对象

问题描述 投票:0回答:2

我在我的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());
android rx-java2
2个回答
3
投票

反应性扩展的核心思想是利用事件的流观察和及时处理。

实际上,如果你需要以简单的方式检索数据,我会说你根本不需要RxJava2。但是,如果您想坚持使用被动方法,则应该收听数据流。

所有RxJava2类型都提供了一个subscribe方法,该方法“通知”本质上是懒惰的数据源,这是一个想要接收数据的观察者,因此使用RxJava2运算符描述的所有数据处理流程都将变为活动状态。

最无痛的方法是将HomeActivity's代码更改为:

vm.getUsers()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(userListAdapter::populateWithNewDataSet);

,假设适配器将具有所提到的方法,该方法将在内部使用notifyDataSetChanged()(或DiffUtil)之类的内容更新UI数据集。

通过这样做,现在可以观察数据源,并且每次发布更新时,UI将使用最新数据重新填充。

P.S。:我刚刚演示了最简单的方法,但是开发人员可以放置与RxJava相关的代码:无论是ViewModelActivity,还是其他一些组件。 RxJava是一个使用方便的工具,它可以简化复杂的异步流程,但是当所有代码库都依赖于它时,RxJava就会出现问题。如果工具在不适当的地方使用,代码库很快就会变得难以管理,脆弱和僵硬。


1
投票

添加@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。

© www.soinside.com 2019 - 2024. All rights reserved.