Как вызвать API рекурсивно с помощью rxAndroid, пока не встретится условие? - PullRequest
0 голосов
/ 07 мая 2019

Я использую модификацию с rxAndroid, пытаюсь получить ответ от сервера, пока сервер не вернет размер списка 0.

getPageAndNext (columns_id), его идентификатор начальной точки принятия на данный момент считается 0 и в следующемВ запросе я передам 9-й идентификатор, чтобы сервер возвращал после 9-го ответа. (10-й, 11-й, ... 15-й ... 19-й)

 Observable<List<Feed>> getPageAndNext(int id) {
        return apiInterface.postGetFeed(membersIds, id)
                .flatMap(feedResponse -> {
                    if (feedResponse.getData().size() > 0) {
                        return Observable.just(feedResponse.getData())
                                .concatWith(getPageAndNext(feedResponse.getData().get(feedResponse.getData().size() - 1).getId()));

                    }
                    return Observer::onComplete;
                });

    }

Здесь на запрос я получаю 10 каналов и вставляюподача в базу данных комнаты методом onNext

getPageAndNext(0)
                .subscribeOn(Schedulers.computation())
                .subscribe(new DisposableObserver<List<Feed>>() {
                    @Override
                    public void onNext(List<Feed> feeds) {
                        //save to room database
                        memberDatabaseRepository.insertMemberList(feeds);

                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.e("jjjj", "error"+e);
                    }

                    @Override
                    public void onComplete() {
                        Log.d("kkkk","done");
                    }
                });

Теперь я не получаю весь ответ от сервера.Я ищу последние 24 часа, но у меня не было никакого решения.

Примечание. После этого я могу выполнить 76 вызовов API, так и не получив ответа, даже только 76 данных вызовов API, сохраненных в базе данных комнаты.но есть около 630 вызовов API

Ссылки: -

Как сделать рекурсивный наблюдаемый вызов в RxJava?

Как игнорировать ошибкуи продолжить бесконечный поток?

RxJava takeUntil с удалением последнего элемента?

Как сделать несколько запросов с реактивным андроидом и модифицировать

1 Ответ

1 голос
/ 09 мая 2019

Наконец-то я решил рекурсивно вызвать API в rxAndroid.takeUntil -> Я проверяю, получу ли я нулевой размер, затем прекращаю рекурсивный вызов.

Observable.range(0, Integer.MAX_VALUE)
                // Get each page in order.
                .concatMap(integer -> {
                    return apiInterface.postGetFeed(membersIds, lastFeedId);
                })
                // Take every result up to and including the one where the next page index is null.
                .takeUntil(result -> {
                    if(!result.getData().isEmpty())
                    lastFeedId = result.getData().get(result.getData().size() - 1).getId();
                    return result.getData().isEmpty();
                })
                .map(FeedResponse::getData)
                .subscribeOn(Schedulers.io())
                .subscribe(new DisposableObserver<List<Feed>>() {
                               @Override
                               public void onNext(List<Feed> feeds) {
                                   Log.d("kkkk", "" + feeds);
                                   memberDatabaseRepository.insertMemberList(feeds, lastFeedId);

                               }

                               @Override
                               public void onError(Throwable e) {
                                   Log.d("kkkk", "error " + e.getMessage());

                               }

                               @Override
                               public void onComplete() {
                                   Log.d("kkkk", "onComplete");
                                   memberDatabaseRepository.getAllFeed(FeedFragment.this);
                               }
                           }
                );
...