Java 在完成多个观察之后做些什么
我在Android上使用RXJava,试图将多个API调用链接在一起,并在两个API调用完成后做一些事情。我的API调用看起来都与提供的代码示例相似。基本上,进行API调用,将每个记录写入onNext中的DB,在所有记录都被写入后,更新一些缓存。我想异步启动这两个调用,然后在两个调用都命中onCompleted之后,再执行其他操作。RX中的正确方法是什么?我不认为我需要拉链,因为我不需要把不同的小溪绑在一起。我在考虑合并,但我的两个API调用返回不同类型的可观测数据。请让我知道。谢谢Java 在完成多个观察之后做些什么,java,android,rx-java,reactive-programming,rx-android,Java,Android,Rx Java,Reactive Programming,Rx Android,我在Android上使用RXJava,试图将多个API调用链接在一起,并在两个API调用完成后做一些事情。我的API调用看起来都与提供的代码示例相似。基本上,进行API调用,将每个记录写入onNext中的DB,在所有记录都被写入后,更新一些缓存。我想异步启动这两个调用,然后在两个调用都命中onCompleted之后,再执行其他操作。RX中的正确方法是什么?我不认为我需要拉链,因为我不需要把不同的小溪绑在一起。我在考虑合并,但我的两个API调用返回不同类型的可观测数据。请让我知道。谢谢 g
getUsers()
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.io())
.flatMap(Observable::from)
.subscribe(new Subscriber<User>() {
@Override
public void onCompleted() {
updateUserCache();
}
@Override
public void onError(Throwable e) {
Log.e(TAG, "Error loading users", e);
}
@Override
public void onNext(User user) {
insertUserToDB(user);
}
});
getLocations()
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.io())
.flatMap(Observable::from)
.subscribe(new Subscriber<Location>() {
@Override
public void onCompleted() {
updateLocationCache();
}
@Override
public void onError(Throwable e) {
Log.e(TAG, "Error loading Locations", e);
}
@Override
public void onNext(Location location) {
insertLocationToDB(location);
}
});
getUsers()
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.io())
.flatMap(可观察::来自)
.subscribe(新订户(){
@凌驾
未完成的公共无效(){
updateUserCache();
}
@凌驾
公共无效申报人(可丢弃的e){
Log.e(标签“加载用户时出错”,e);
}
@凌驾
public void onNext(用户){
insertUserToDB(用户);
}
});
getLocations()
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.io())
.flatMap(可观察::来自)
.subscribe(新订户(){
@凌驾
未完成的公共无效(){
updateLocationCache();
}
@凌驾
公共无效申报人(可丢弃的e){
Log.e(标签“错误加载位置”,e);
}
@凌驾
公共void onNext(位置){
insertLocationToDB(位置);
}
});
您的想法是正确的。您应该使用zip
运算符
您的每一个函数都应该进行调用、写入数据库并执行您需要的所有操作。ATzip
输出函数不同:当调用它时,您可以确保所有可观察的都已成功完成->只需完成反应流即可
创建可观察的列表
:
List<Observable<?>> observableList = new ArrayList<>();
observableList.add(
getUsers()
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.io())
.flatMap(Observable::from)
.insertUserToDB(user)
.toList());
observableList.add(
getLocations()
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.io())
.flatMap(Observable::from)
.insertLocationToDB(location)
.toList());
这是伪代码,但我希望您理解这个想法。您的想法是正确的。您应该使用zip
运算符
您的每一个函数都应该进行调用、写入数据库并执行您需要的所有操作。ATzip
输出函数不同:当调用它时,您可以确保所有可观察的都已成功完成->只需完成反应流即可
创建可观察的列表
:
List<Observable<?>> observableList = new ArrayList<>();
observableList.add(
getUsers()
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.io())
.flatMap(Observable::from)
.insertUserToDB(user)
.toList());
observableList.add(
getLocations()
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.io())
.flatMap(Observable::from)
.insertLocationToDB(location)
.toList());
这是伪代码,但我希望您理解这个想法。.zip()是正确的方法
您可能希望将改装返回设置为单个,而不是可观察的,尽管.zip()是正确的方法
如果有人需要,您可能希望将改装返回设置为单个而不是可观察,以下是我根据R.Zagórski建议使用的代码:
List<Observable<?>> observableList = new ArrayList<>();
observableList.add(
getUsers()
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.io())
.flatMap(Observable::from)
.doOnNext(user->insertUser(user))
.toList()
);
observableList.add(
getLocations()
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.io())
.flatMap(Observable::from)
.doOnNext(location->insertLocation(location))
.toList()
);
Observable.zip(observableList, new FuncN<Object>() {
@Override
public Observable<?> call(Object...args) {
return Observable.empty();
}).subscribe(new Subscriber<Object>() {
@Override
public void onCompleted() {
updateUserCache();
updateLocationCache();
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Object o) {
}
});
List如果有人需要,下面是我根据R.Zagórski的建议使用的代码:
List<Observable<?>> observableList = new ArrayList<>();
observableList.add(
getUsers()
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.io())
.flatMap(Observable::from)
.doOnNext(user->insertUser(user))
.toList()
);
observableList.add(
getLocations()
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.io())
.flatMap(Observable::from)
.doOnNext(location->insertLocation(location))
.toList()
);
Observable.zip(observableList, new FuncN<Object>() {
@Override
public Observable<?> call(Object...args) {
return Observable.empty();
}).subscribe(new Subscriber<Object>() {
@Override
public void onCompleted() {
updateUserCache();
updateLocationCache();
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Object o) {
}
});
list谢谢您的回复。几个问题。首先调用insertUserToDB,这不需要在subscribe方法调用中发生,这意味着我无法为toList()返回可观察的?我最终使用doOnNext插入数据库。感谢您的响应。几个问题。首先调用insertUserToDB,这不需要在subscribe方法调用中发生,这意味着我不能为toList()返回一个可观察的?我最终使用doOnNext插入数据库。