我有一些长时间初始化的类,例如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);
}
}
});
}
});
}
这是正确的决定吗?
答案 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的目的而无法实现真正的功能。