多个顺序 Observable,每个 Observable 之间有时间延迟
Multiple sequential Observables with timely delay between Each of them
我正在尝试获得 google places
并且根据 api 限制,每个请求不能获得超过 20 个名额,下一个请求需要上一个请求的 nextPageToken
。
问题:
Zip
运算符立即执行所有请求,但我需要它们在每个 Observable
调用
之间按顺序及时延迟 4 seconds
Delay
运算符允许等待,但它的真正含义是它会立即执行 Zip
调用并且 return 我会在给定的延迟时间后得到结果,这是不需要。
我的来源:
LatLng some = new LatLng(31.471199, 74.234940);
Observable
.zip(getNearByPlaces(some), getNearByPlaces(some), getNearByPlaces(some), new Func3<List<PlaceInfo>, List<PlaceInfo>, List<PlaceInfo>, List<PlaceInfo>>() {
@Override
public List<PlaceInfo> call(List<PlaceInfo> placeInfos, List<PlaceInfo> placeInfos2, List<PlaceInfo> placeInfos3) {
placeInfos2.addAll(placeInfos3);
placeInfos.addAll(placeInfos2);
return placeInfos;
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<List<PlaceInfo>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
e.printStackTrace();
}
@Override
public void onNext(List<PlaceInfo> placeInfos) {
adapter.setPlaces(placeInfos);
}
});
我是初学者,大约 1 周前开始使用 rxjava,所以您可以预料到错误。
假设您有以下响应模型
class Response {
private String pageToken;
private List<PlaceInfo> places;
//setters, getters etc
}
你有两种方法可以使用 API
Observable<Response> getNearByPlaces(LatLng latLng) {...}
Observable<Response> getNextNearByPlaces(String pageToken) {...}
定义 Transformer
以获取更多地点。它等待 4 秒,然后获取下一个位置并将源位置添加到响应中。
private Observable.Transformer<Response, Response> addNextPlaces() {
return observable -> observable
.delay(4, TimeUnit.SECONDS)
.flatMap(sourceResponse -> getNextNearByPlaces(sourceResponse.getPageToken()),
((sourceResponse, nextResponse) -> {
nextResponse.getPlaces().addAll(sourceResponse.getPlaces());
return responseNext;
}));
}
那你就可以这样来做你需要的了
getNearByPlaces(latLng)
.compose(addNextPlaces())
//add here additional compose methods if you need them
.subscribe(resultResponse -> {
resultResponse.getPlaces() //handle result List
}, error -> {
//handle error
});
P.S。注意线程。 delay
将调度程序切换为 computation
P.P.S。我怀疑有一个更简单和优雅的解决方案:)
我正在尝试获得 google places
并且根据 api 限制,每个请求不能获得超过 20 个名额,下一个请求需要上一个请求的 nextPageToken
。
问题:
之间按顺序及时延迟Zip
运算符立即执行所有请求,但我需要它们在每个Observable
调用4 seconds
Delay
运算符允许等待,但它的真正含义是它会立即执行Zip
调用并且 return 我会在给定的延迟时间后得到结果,这是不需要。
我的来源:
LatLng some = new LatLng(31.471199, 74.234940);
Observable
.zip(getNearByPlaces(some), getNearByPlaces(some), getNearByPlaces(some), new Func3<List<PlaceInfo>, List<PlaceInfo>, List<PlaceInfo>, List<PlaceInfo>>() {
@Override
public List<PlaceInfo> call(List<PlaceInfo> placeInfos, List<PlaceInfo> placeInfos2, List<PlaceInfo> placeInfos3) {
placeInfos2.addAll(placeInfos3);
placeInfos.addAll(placeInfos2);
return placeInfos;
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<List<PlaceInfo>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
e.printStackTrace();
}
@Override
public void onNext(List<PlaceInfo> placeInfos) {
adapter.setPlaces(placeInfos);
}
});
我是初学者,大约 1 周前开始使用 rxjava,所以您可以预料到错误。
假设您有以下响应模型
class Response {
private String pageToken;
private List<PlaceInfo> places;
//setters, getters etc
}
你有两种方法可以使用 API
Observable<Response> getNearByPlaces(LatLng latLng) {...}
Observable<Response> getNextNearByPlaces(String pageToken) {...}
定义 Transformer
以获取更多地点。它等待 4 秒,然后获取下一个位置并将源位置添加到响应中。
private Observable.Transformer<Response, Response> addNextPlaces() {
return observable -> observable
.delay(4, TimeUnit.SECONDS)
.flatMap(sourceResponse -> getNextNearByPlaces(sourceResponse.getPageToken()),
((sourceResponse, nextResponse) -> {
nextResponse.getPlaces().addAll(sourceResponse.getPlaces());
return responseNext;
}));
}
那你就可以这样来做你需要的了
getNearByPlaces(latLng)
.compose(addNextPlaces())
//add here additional compose methods if you need them
.subscribe(resultResponse -> {
resultResponse.getPlaces() //handle result List
}, error -> {
//handle error
});
P.S。注意线程。 delay
将调度程序切换为 computation
P.P.S。我怀疑有一个更简单和优雅的解决方案:)