如何为异步响应创建Observable?

时间:2017-02-08 18:34:45

标签: android rx-java rx-java2

我有一个异步方法,如下所示:

void getPlaceInfo(Place place, PlaceCallback callback)

例如,我的PlaceCallback有一种方法:

void success(InfoPlace place);

我希望创建Observable来等待来自两个请求的响应:

getPlaceInfo(...); // first call
getPlaceInfo(...); // second call

然后我想同时得到两个回应。

我能成功吗?

2 个答案:

答案 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()来组合电话。