gpt4 book ai didi

android - BehaviorSubject 处理中的 BehaviorSubject

转载 作者:行者123 更新时间:2023-11-30 00:56:43 25 4
gpt4 key购买 nike

场景我有一个 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) {
}
});
}

最佳答案

如果我的理解正确并且您想要获取 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 如何递归调用自身来获取下一页。

关于android - BehaviorSubject 处理中的 BehaviorSubject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40027103/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com