Java 在完成多个观察之后做些什么

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

我在Android上使用RXJava,试图将多个API调用链接在一起,并在两个API调用完成后做一些事情。我的API调用看起来都与提供的代码示例相似。基本上,进行API调用,将每个记录写入onNext中的DB,在所有记录都被写入后,更新一些缓存。我想异步启动这两个调用,然后在两个调用都命中onCompleted之后,再执行其他操作。RX中的正确方法是什么?我不认为我需要拉链,因为我不需要把不同的小溪绑在一起。我在考虑合并,但我的两个API调用返回不同类型的可观测数据。请让我知道。谢谢

    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
运算符

您的每一个函数都应该进行调用、写入数据库并执行您需要的所有操作。AT
zip
输出函数不同:当调用它时,您可以确保所有可观察的
都已成功完成->只需完成反应流即可

创建可观察的
列表

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
运算符

您的每一个函数都应该进行调用、写入数据库并执行您需要的所有操作。AT
zip
输出函数不同:当调用它时,您可以确保所有可观察的
都已成功完成->只需完成反应流即可

创建可观察的
列表

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插入数据库。