Call the API several times until all data is loaded

I have a use case where I want to repeatedly call the web API for each user until all the data has been downloaded.

The web API that I have allows you to get a maximum of 100 entries for a user at the request of the API. I can specify startTimeand specify the timestamp of the records that will be downloaded for this user:

void downloadRecord(String userId, recordStartTime, recordEndTime, int countOfRecord, ResultCallBack)

If the number of records is between recordStartTimeand recordEndTimeexceeds 100, then the API response returns only 100 records. And then I need to iterate over this call with a new start time (time of the 100th record just loaded) until all records are loaded.

final long recordStartTime = timeStampFrom2DaysAgo//;
Observable.from(arrayListOfUserIds).flatMap(new Func1<String, Observable<?>>() {
    @Override
    public Observable<?> call(String userId) {
        long recordEndTime = getCurrentTimeMS();
        //keep downloading records 
        downloadRecord(userId, recordStartTime, recordEndTime, 100, new ResultCallBack() {
            //if records are < 100 then stop 
            //else keep downloading 
        });
    }
}).subscribe();

Please suggest if there is an example RxJava code that I can use to solve my problem.

thank

+2
2

. , . requests DownloadParams, userId, recordStartTime, recordEndTime countOfRecord, Observable<DownloadParams> requests. responses , .. Observable<List<Record>> responses.

responses, , requests, , requests responses, DownloadParams . , requests Observable, userId . Observable .startWith(firstDownloadParams).

, . , Rx Cycle.js RxJS. , , .

RxJava , , , . Observables , :

Observable<DownloadParams> requests = responses.flatMap( /* ... */ )
    .startWith(firstDownloadParams);
Observable<List<Record>> responses = requests.flatMap( /* ... */ );

, , . . :

PublishSubject<List<Record>> responsesProxy = PublishSubject.create();
Observable<DownloadParams> requests = responsesProxy.flatMap( /* ... */ )
    .startWith(firstDownloadParams);
Observable<List<Record>> responses = requests.flatMap( /* ... */ );

responsesProxy responses, requests responsesProxy. responsesProxy responses. , :

responses.subscribe(responsesProxy);

, , , .

flatMap. requests.flatMap( ) , . , , , RxJava.

responsesProxy.flatMap( ) , 100 , DownloadParams recordStartTime, Observable.just(newDownloadParams). 100, Observable.empty().

+4

: . gist .

, . , BufferUntilSubscriber , RxJava Subject, , , .

: gist, MissinBackpressureException.

+2

Source: https://habr.com/ru/post/1658593/


All Articles