如何使用Retrofit和RXJava多次调用相同的API。我现在使用以下方法

问题描述 投票:1回答:3

好。所以API文档说:

通过更改“开始”和“计数”参数获取多达100家餐厅,最大值为20. API链接:https://developers.zomato.com/documentation#!/restaurant/search

这是示例代码:

restaurantList = new ArrayList<>();
    restaurantFinderAPI = RetrofitClient.getRetrofitClientAPI();
    restaurantScheduler = Schedulers.newThread();

    for (int i = 0; i <= 80; i += 20) {
        restaurantModelObservable = restaurantFinderAPI.getRestaraunts(city, entitytype, searchString, i, 20);

        restaurantModelObservable.subscribeOn(restaurantScheduler);
        restaurantModelObservable.observeOn(AndroidSchedulers.mainThread());
        restaurantModelObservable.subscribe(new Observer<RestaurantModel>() {
            @Override
            public void onSubscribe(Disposable d) {
                COUNT++;
                restaurantDisposable = d;
            }

            @Override
            public void onNext(RestaurantModel value) {
                restaurantList.addAll(value.getRestaurants());
            }

            @Override
            public void onError(Throwable e) {
                restaurantDisposable.dispose();
                onRestaurantSync.onRestaurantSyncFail();
            }

            @Override
            public void onComplete() {
                if (COUNT == 5) {
                    new ModifyTask().execute(restaurantList);
                    COUNT = 0;
                }
            }
        });

这是Retrofit界面:

    String ZOMATO_ROOT_URL = "https://developers.zomato.com/api/v2.1/";

@GET("search")
@Headers({"Accept: application/json","user-key: 258f3e496748d15cb792bc554000d6b6"})
Observable<RestaurantModel> getRestaraunts(@Query("entity_id") int entityID,
                                           @Query("entity_type") String entity_type,
                                           @Query("q")String searchFor,
                                           @Query("start") int start,
                                           @Query("count") int count);

我通过COUNT字段进行5次通话,因此通过更改“i”可以得到100次结果。一旦我得到100个结果,我就开始一个asynctask来对dat进行一些处理。这是多次调用相同API的好方法。我是RXJava的新手,我找不到一个好的答案。请帮忙。谢谢

android api retrofit2 rx-android rx-java2
3个回答
0
投票

A facility for threads to schedule tasks for future execution in a background thread. Tasks may be scheduled for one-time execution, or for repeated execution at regular intervals.

scheduleAtFixedRate

void scheduleAtFixedRate (TimerTask task, 
                long delay, 
                long period)

Schedules the specified task for repeated fixed-rate execution, beginning after the specified delay. Subsequent executions take place at approximately regular intervals, separated by the specified period.

 Timer timer=  new Timer();

        timer.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {

                //Call Service Multiple times 
                //At EVery 6 seconds

            }
        },0,6000);

0
投票

我是在RX的concat操作员的帮助下完成的。我简单地从像{20,40,60,80}这样的偏移数组中做出了一个观察结果,并将每个发射的调用发送到其余的Api,并且对于每个结果,我将它添加到一个arraylist。


0
投票

也许是这样的:

Disposable disposable = Observable.range(0, 5)
            .subscribeOn(Schedulers.io())
            .flatMap(i -> getRestaraunts(city, entitytype, searchString, i * 20, 20))
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe();
© www.soinside.com 2019 - 2024. All rights reserved.