如何使用rxAndroid递归调用api直到满足条件?

时间:2019-05-07 14:23:04

标签: android rx-java rx-java2 rx-android

我正在对rxAndroid进行改造,试图从服务器获取响应,直到服务器返回0列表大小。

getPageAndNext(rows_id),现在将其接受起始点ID考虑为0,在下一个请求中,我将传递第9个ID,以便服务器在第9个ID响应后返回。(10th,11th,... 15th ... 19th )

 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调用

链接:-

How To Do Recursive Observable Call in RxJava?

How to ignore error and continue infinite stream?

RxJava takeUntil with emmision of last item?

How to make multiple requests with reactive android and retrofit

1 个答案:

答案 0 :(得分:0)

最后,我解决了rxAndroid中的递归调用API。 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);
                               }
                           }
                );