繁体   English   中英

如何使用 Retrofit 和 RxJava 重试对餐馆的相同搜索查询以从 Google Map Api 获取下一页结果

[英]How to retry the same search query for restaurants to get the next page of results from Google Map Api, using Retrofit and RxJava

我正在向 Google Map 发出请求,以获取餐厅列表,使用附近的搜索 Api。 https://developers.google.com/maps/documentation/places/web-service/search-nearby服务器通过最多包含 20 个结果的页面发送其响应。 如果有额外的页面可用,则设置 json next_page_token 属性,其中包含要作为参数传递给下一次搜索的值。 使用 retrofit 和 RxJava,我知道如何进行第一次搜索,并获取 next_page_token。 但我不知道如何重试相同的请求。 任何帮助将不胜感激。

public Observable<PlaceNearbySearch> streamFetchRestaurants(String location, int radius, String type) {
// search for the list of restaurants
    RestoApi restoApi = RetrofitBuilder.getRetrofit().create(RestoApi.class);
        return restoApi.getRestoFirsttPage(location, radius, type, GOOGLE_MAP_API_KEY) 
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .timeout(10, TimeUnit.SECONDS);
}
public Observable<PlaceDetail> streamFetchDetails(String placeId) {
// search details for each restaurants of the list
RestoApi restoApi = RetrofitBuilder.getRetrofit().create(RestoApi.class);
return restoApi.getPlaceDetails(placeId, GOOGLE_MAP_API_KEY)
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .timeout(10, TimeUnit.SECONDS);
}

public Single<List<PlaceDetail>> streamFetchRestaurantDetails(String location, int radius, String type) {
// chains the 2 previous requests
    return streamFetchRestaurants(location, radius, type)
            .flatMapIterable(new Function<PlaceNearbySearch, List<PlaceNearbySearchPlace>>() {
                @Override
                public List<PlaceNearbySearchPlace> apply(PlaceNearbySearch placeNearbySearch) throws Exception {
                    // Is next_page_token set?
                    // In case it is, how would you query the next page??
                    Log.d(TAG, "apply: next_page_token: " + placeNearbySearch.getNext_page_token());
                    return placeNearbySearch.getResultSearches();

                }
            })
            .flatMap(new Function<PlaceNearbySearchPlace, Observable<PlaceDetail>>() {
                @Override
                public Observable<PlaceDetail> apply(PlaceNearbySearchPlace placeNearbySearchPlace) throws Exception {
                    return streamFetchDetails(placeNearbySearchPlace.getPlaceId());
                }
            })
            .toList()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread());
}

private void test_streamFetchRestaurantDetails() throws InterruptedException {
// test method
    String location = "48.854685336064264, 2.3467574997969596";
    int radius = 1500;
    String type = "restaurant";
    callstreamFetchRestaurantDetails(location, radius, type);
}

private void callstreamFetchRestaurantDetails(String location, int radius, String type) {
    streamFetchRestaurantDetails(location, radius, type)
            .subscribe(new DisposableSingleObserver<List<PlaceDetail>>() {
                @RequiresApi(api = Build.VERSION_CODES.N)
                @Override
                public void onSuccess(@io.reactivex.rxjava3.annotations.NonNull List<PlaceDetail> placeDetails) {
                    // handle list of placeDetails
                }

                @Override
                public void onError(@io.reactivex.rxjava3.annotations.NonNull Throwable e) {
                    Log.d(TAG, "onError: " + e.getMessage());
                }
            });
}

您需要使用“next_page_token”,这将返回您接下来的 20 个结果。 如果没有更多可用结果,它将不会向您发送 next_page_token。 查看文档以了解此令牌的用法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM