【问题标题】:BehaviorSubject within a BehaviorSubject handlingBehaviorSubject 处理中的 BehaviorSubject
【发布时间】:2016-10-13 17:11:09
【问题描述】:

场景 我有一个 Territories 列表,我想从服务器获取每个 Territory 中的所有 Items。所以,我决定使用BehaviorSubject 来尝试一下。我不知道我是不是“疯了”。这就是我所做的:

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);
}

它所做的只是挂起,就像我这样做时根本没有运行一样

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) {
        }
    });
}

【问题讨论】:

    标签: android retrofit rx-java behaviorsubject


    【解决方案1】:

    如果我理解正确并且您所追求的是获取 getBakeries 响应的页面,那么以下递归函数调用应该可以解决问题:

    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 如何递归调用自身来获取下一页。

    【讨论】:

    • 我现在正在测试它。但是,查看代码,对于我正在尝试做的事情非常有意义。有多个地区。每个地区都有多个分页面包店。其中getItemByTerritory() 使用Observable.from(territories).flatMap(territory -&gt; fetchTerritoryPage(territory, 0))thisPage.concatWith(nextPage) 解决了分页获取
    • 我已经重构了代码以使用BehaviorSubject 但是,Tail Recursion 是一个巨大的负载拖累
    猜你喜欢
    • 2021-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-07
    • 2023-04-03
    • 2017-05-04
    • 2017-01-22
    相关资源
    最近更新 更多