Как вызывать один и тот же API N раз, используя Retrofit и RXJava. На данный момент я использую следующий подход

Хорошо. Итак, документация API гласит:

Получите до 100 ресторанов, изменив параметры start и count с максимальным значением count 20. API LINK: https://developers.zomato.com/documentation

Это пример кода:

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

Я сделал вызов 5 раз, что считается полем COUNT, так что это дало бы 100 результатов, изменив 'i'. Как только я получу 100 результатов, я запускаю асинхронную задачу для некоторой обработки данных. Это хороший способ вызывать один и тот же API несколько раз. Я новичок в RXJava, и я не мог найти хороший ответ. Пожалуйста помоги. Спасибо

3 ответа

Может быть, что-то вроде этого:

Disposable disposable = Observable.range(0, 5)
            .subscribeOn(Schedulers.io())
            .flatMap(i -> getRestaraunts(city, entitytype, searchString, i * 20, 20))
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe();

Я сделал это с помощью оператора concat RX. Я просто сделал наблюдаемый из массива смещений, таких как {20,40,60,80}, и сделал вызов для каждой эмиссии для остальных Api, и для каждого результата я добавил ее в массив данных.

Возможность для потоков планировать задачи для будущего выполнения в фоновом потоке. Задачи могут быть запланированы для одноразового выполнения или для повторного выполнения с регулярными интервалами.

scheduleAtFixedRate

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

Планирует указанную задачу для повторного выполнения с фиксированной скоростью, начиная с указанной задержки. Последующие казни происходят примерно через равные промежутки времени, разделенные указанным периодом.

 Timer timer=  new Timer();

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

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

            }
        },0,6000);
Другие вопросы по тегам