首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BehaviorSubject在BehaviorSubject处理中

BehaviorSubject在BehaviorSubject处理中
EN

Stack Overflow用户
提问于 2016-10-13 17:11:09
回答 1查看 451关注 0票数 1

场景我有一个的列表,我想从服务器中获取每个区域中的所有条目。因此,我决定使用BehaviorSubject来尝试它。我不知道我是不是疯了。我就是这样做的:

代码语言:javascript
复制
private Observable<ItemListResponse> getItemByTerritory() {

    List<String> territories = PrefUtils.getUserTerritories(context);

    BehaviorSubject<Integer> territoryControl = BehaviorSubject.<Integer>create(0);
    Observable<ItemListResponse> territoryRet = territoryControl.asObservable().concatMap(integer -> {

        if (integer != territories.size()) {

            BehaviorSubject<Integer> ret = BehaviorSubject.create(1);
            return ret.asObservable().concatMap(integer1 -> {

                if (integer > 0) {
                    return bakeryAPI.getBakeries("Bearer " + PrefUtils.getToken(context), integer1, 21, territories.get(integer))
                            .subscribeOn(Schedulers.io())
                            .observeOn(AndroidSchedulers.mainThread())
                            .doOnNext(itemListRespont -> {
                                if (itemListRespont.getItemResponse().getMeta().getPage() != itemListRespont.getItemResponse().getMeta().getPageCount() && itemListRespont.getItemResponse().getMeta().getPageCount() > 0) {
                                    ret.onNext(integer1 + 1);
                                } else {
                                    ret.onNext(-1);
                                    territoryControl.onNext(integer + 1);
                                }
                            });
                } else {
                    return Observable.<ItemListResponse>empty().doOnCompleted(ret::onCompleted);
                }
            });
        } else {
            return Observable.<ItemListResponse>empty().doOnCompleted(territoryControl::onCompleted);
        }
    });
    return Observable.defer(() -> territoryRet);
}

它所做的只是挂起,就像我这样做的时候什么都没有运行。

代码语言:javascript
复制
public void getItemByTerritory(APIRequestListener apiRequestListener){
    realm.executeTransaction(realm1 -> realm1.where(RealmItem.class).findAll().deleteAllFromRealm());

    getItemByTerritory().subscribe(new Subscriber< ItemListResponse >() {
        @Override
        public void onCompleted() {
            Log.e(TAG, "Completed Bakery");
            apiRequestListener.completed();
            unsubscribe();
        }

        @Override
        public void onError(Throwable e) {
            e.printStackTrace();
            apiRequestListener.handleError(e);
        }

        @Override
        public void onNext(ItemListResponse itemListRespont) {
        }
    });
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-13 19:10:53

如果我正确地理解了,并且您想要的是获取页面的getBakeries响应,那么下面的递归函数调用应该能做到这一点:

代码语言:javascript
复制
private Observable<ItemListResponse> getItemByTerritory() {
    List<String> territories = PrefUtils.getUserTerritories(context);
    return Observable.from(territories).flatMap(territory -> fetchTerritoryPage(territory, 0));
}

private Observable<ItemListResponse> fetchTerritoryPage(String territory, int page) {
    System.out.println("Fetch territory page " + page);
    return bakeryAPI.getBakeries("Bearer " + PrefUtils.getToken(context), page, 21, territory).flatMap(response
            -> {
        final ItemListResponse.ItemResponse.Meta meta = response.getItemResponse().getMeta();
        final Observable<ItemListResponse> thisPage = Observable.just(response);
        if (page < meta.getPageCount()) {
            final Observable<ItemListResponse> nextPage = fetchTerritoryPage(territory, page + 1);
            return thisPage.concatWith(nextPage);
        } else {
            return thisPage;
        }
    });
}

注意fetchTerritoryPage如何递归地调用自己以获取下一页。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40027103

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档