Как вызывать один и тот же 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);