Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
嵌套RxJava可观察对象的正确方法?_Java_Rx Java - Fatal编程技术网

嵌套RxJava可观察对象的正确方法?

嵌套RxJava可观察对象的正确方法?,java,rx-java,Java,Rx Java,我正在使用RxJava和嵌套观察对象,如下所示。我想把一个可观测对象称为另一个可观测对象,让外部可观测对象发出内部可观测对象的结果。它似乎可以工作,但我不确定这是正确的实现,因为我无法找到任何文档进行确认 public Observable<User> updateUser(final String id) { return Observable.create(new Observable.OnSubscribe<User>() { @Overri

我正在使用RxJava和嵌套观察对象,如下所示。我想把一个可观测对象称为另一个可观测对象,让外部可观测对象发出内部可观测对象的结果。它似乎可以工作,但我不确定这是正确的实现,因为我无法找到任何文档进行确认

public Observable<User> updateUser(final String id) {
    return Observable.create(new Observable.OnSubscribe<User>() {
        @Override
        public void call(final Subscriber<? super User> observer) {
                try {
                if (!observer.isUnsubscribed()) {
                    getUser(id).subscribe(new Action1<User>() {
                        @Override
                        public void call(User user) {
                            observer.onNext(user);
                                observer.onCompleted();
                            }
                        });
                    }
                } catch (Exception e) {
                    observer.onError(e);
                }
        }
    });
}

public Observable<User> getUser(final String id) {
...
}
public Observable updateUser(最终字符串id){
返回Observable.create(newobservable.OnSubscribe(){
@凌驾

public void call(最终订户当您正在进行
可观察的
转换时,避免呼叫
订阅
,因为您必须注意@akarnokd和@zsxwing在评论中提到的所有问题

我也会避免使用
Observable.create
,因为创建
OnSubscribe
实现需要考虑背压和随之而来的复杂并发事务。更喜欢
Observable.just
Observable.from
Observable.range
Observable.using
(还有更多内容,请查看wiki),为了更高级的目的,请实现
SyncOnSubscribe

此代码可能涵盖您的用例:

public Observable<User> updateUser(final String id) {
    return getUser(id).doOnNext(user -> updateUser(user));
}

public void updateUser(User user) {
    //whatever you want here
}

public Observable<User> getUser(final String id) {
    ...
}
public Observable updateUser(最终字符串id){
返回getUser(id).doOnNext(用户->更新用户(用户));
}
public void updateUser(用户){
//你想要什么都行
}
公共可观察的getUser(最终字符串id){
...
}

当您正在进行
可观察的
转换时,避免调用
订阅
,因为您必须注意注释中@akarnokd和@zsxwing提到的所有问题

我也会避免使用
Observable.create
,因为创建
OnSubscribe
实现需要考虑背压和随之而来的复杂并发事务。更喜欢
Observable.just
Observable.from
Observable.range
Observable.using
(还有更多内容,请查看wiki),为了更高级的目的,请实现
SyncOnSubscribe

此代码可能涵盖您的用例:

public Observable<User> updateUser(final String id) {
    return getUser(id).doOnNext(user -> updateUser(user));
}

public void updateUser(User user) {
    //whatever you want here
}

public Observable<User> getUser(final String id) {
    ...
}
public Observable updateUser(最终字符串id){
返回getUser(id).doOnNext(用户->更新用户(用户));
}
public void updateUser(用户){
//你想要什么都行
}
公共可观察的getUser(最终字符串id){
...
}

我认为首选的方法是链接可观察对象,而不是嵌套它们…为什么要嵌套它,可以直接返回/调用getUser?我想嵌套它,因为它使调用代码更简单。不可观察的版本类似于公共用户updateUser(最终字符串id){//update User code return getUser(id);}但是在您的示例中,getUser和updateUser都返回Observable,updateUser只运行getUser并发出其值,所以
updateUser(id){return getUser(id);}
不要这样做。这通常意味着取消订阅、资源清理和背压被破坏,而且很难解释。如果你想正确处理这些事情,你的代码将比链接观察对象复杂得多/我认为首选的方法是链接观察对象,而不是嵌套它们……你为什么要嵌套它,哟你可以直接返回/调用getUser?我想嵌套它,因为它使调用代码更简单。不可观察的版本类似于公共用户updateUser(最终字符串id){//update User code return getUser(id);}但是在您的示例中,getUser和updateUser都返回Observable,updateUser只运行getUser并发出其值,所以
updateUser(id){return getUser(id);}
不要这样做。这通常意味着取消订阅、资源清理和背压被破坏,并且很难进行推理。如果您想正确处理这些事情,您的代码将比链接观察对象复杂得多/