如何等待acync Observable在另一个Observable上完成

时间:2017-02-21 08:08:24

标签: java asynchronous rx-java reactive-programming

我有一些长时间初始化的类,例如Api。 我的经理类加载Api类异步,代码

class MyManager{
    private Observable<Api> apiProvider
    private Api mApi;

    MyManager(Observable<Api> apiProvider){
       this.apiProvider = apiProvider;
       apiProvider.subscribe(api -> mApi = api);
    }
}

但是客户端可以调用MyManager类的方法,这些方法在创建之前需要Api实例。

public Observable<List<Value>> loadVlues() {
    return Observable.create(new Observable.OnSubscribe<List<Value>>() {
        @Override
        public void call(Subscriber<? super List<Value>> subscriber) {
            try {
                List<Value>> values = mApi.getValues();
                subscriber.onNext(values);
            } catch (Exception e) {
                subscriber.onError(e);
            }
        }
    });
}

我需要第二个observable首先等待执行apiProvider observable。 例如,在java线程中有简单的 join()运算符。

使用RXJava进行此操作的最佳方式是什么?

现在我使用BlockingObservable解决问题

 public Observable<List<Value>> loadValues() {

    return Observable.create(new Observable.OnSubscribe<List<Value>>() {
        @Override
        public void call(Subscriber<? super List<Value>> subscriber) {
                BlockingObservable.from(apiProvider).subscribe(new Subscriber<Api>() {
                    @Override
                    public void onCompleted() {

                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onNext(Api api) {
                        try {
                            List<Value>> values = mApi.getValues();
                            subscriber.onNext(values);
                        } catch (Exception e) {
                            subscriber.onError(e);
                        }
                    }
                });
        }
    });
}

这是正确的决定吗?

1 个答案:

答案 0 :(得分:1)

此时不应该阻止。

怎么样

class MyManager {

    Observable<Api> apiProvider;

    MyManager(Observable<Api> apiProvider){
       // cache so can be fetched several times
       this.apiProvider = apiProvider.cache();
    }
}

然后,在loadValues()上,在apiprovider observable上映射新的observable,如:

public Observable<List<Value>> loadValues() {
    return
       apiProvider.map(new Func1<Api, List<Value>>() {
            @Override
            public List<Value> call(Api api) {
                return api.getValues();
            }
       });
}

就像现在删除的答案BlockingObservables should be used for test/demo purposes中提到的@Cochi一样,不是因为它们破坏了使用observables的目的而无法实现真正​​的功能。