我有一个异步方法,如下所示:
void getPlaceInfo(Place place, PlaceCallback callback)
例如,我的PlaceCallback
有一种方法:
void success(InfoPlace place);
我希望创建Observable
来等待来自两个请求的响应:
getPlaceInfo(...); // first call
getPlaceInfo(...); // second call
然后我想同时得到两个回应。
我能成功吗?
答案 0 :(得分:2)
所以你需要结合2个回调来评估一个函数,如:
Response computeResponse(InfoPlace infoPlace, InfoPlace infoPlace2) {
...
}
你想要使用Rx。这里有两个问题;将回调方法包装到Observable中,然后将它们组合起来。
您不能只是实例化一个Observable并调用myObservable.send(value)或myObservable.next(value)。第一种解决方案是使用Subject。另一个解决方案(下面的解决方案)是使用Observable.create()创建observable。你调用回调方法并在方法Observable.create()中创建监听器,因为它在Observable.create()中你可以调用onSuccess()方法,该方法告诉Observable传递一个值:
Single<InfoPlace> getInfoPlaceSingle(Place place) {
return Single.create(e -> getPlaceInfo(place, new PlaceCallback() {
@Override
public void success(InfoPlace infoPlace) {
e.onSuccess(infoPlace);
}
}));
}
或者使用Java 8:
Single<InfoPlace> getInfoPlaceSingle(Place place) {
return Single.create(e -> getPlaceInfo(place, e::onSuccess));
}
注意,我使用了Single而不是Observable,因为你只等待一个值。兴趣是你的功能更具表现力的合同。
将东西包装成Observable是一件痛苦的事,但现在你处于反应领域,Rx为你提供了一个完整的工具箱来处理它们。第二部分 - 结合可观察性 - 很容易:
Single.zip(getInfoPlaceSingle(place1), getInfoPlaceSingle(place2), this::computeResponse);
答案 1 :(得分:1)
使用Observable.fromEmitter()
包裹您的异步电话,然后您可以使用Observable.zip()
来组合电话。