调整clemp6r的解决方案,这是另一个既不需要主题也不需要嵌套订阅的解决方案:
api.getKey().flatMap(new Func1>() {
@Override
public Observable call(String key) {
return Observable.create(new Observable.OnSubscribe(){
@Override
public void call(final Subscriber super String> subscriber) {
Foo foo = new Foo();
foo.setAwesomeCallback(new AwesomeCallback() {
@Override
public void onAwesomeReady(String awesome) {
if (! subscriber.isUnsubscribed()) {
subscriber.onNext(awesome);
subscriber.onComplete();
}
}
});
foo.makeAwesome();
}
});
}).flatMap(new Func1>() {
@Override
public Observable call(String awesome) {
return sendAwesome(awesome);
}
}).subscribe(new Action1() {
@Override
public void call(Void aVoid) {
handleAwesomeSent();
}
});
一般来说,我认为总是可以使用Observable.create()在Observable中包装任何基于回调的异步操作.