【问题标题】:Multiple sequential Observables with timely delay between Each of them多个连续的 Observable,每个 Observable 之间有及时的延迟
【发布时间】:2016-11-12 00:47:07
【问题描述】:

我正在尝试获取 google places,根据 api 限制,每个请求不能获得超过 20 个位置,并且下一个请求需要上一个请求的 nextPageToken

问题:

  • Zip 操作员立即执行所有请求,但我需要它们在每个Observable 调用之间按顺序和及时延迟4 seconds

  • Delay 运算符允许等待,但实际上它会立即执行Zip 调用并在给定的延迟时间后返回结果,这是不希望的。

我的来源:

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,所以你可以预料到错误。

【问题讨论】:

    标签: android google-maps google-places-api rx-java rx-android


    【解决方案1】:

    假设您有以下响应模型

    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
            });
    

    附:请注意线程。 delay 将调度程序切换到 computation

    附言我怀疑有一个更简单和优雅的解决方案:)

    【讨论】:

    • 谢谢,它成功了,最后一个问题是它是一个三个请求过程,但我想上面的示例正在处理 2 个请求
    • .compose(addNextPlaces()) 增加了一个额外的请求,所以如果你想链接更多的请求 - 只需复制粘贴这个字符串并将其放在下面
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多