gpt4 book ai didi

android - 编写多个网络调用 RxJava - Android

转载 作者:搜寻专家 更新时间:2023-11-01 07:56:50 24 4
gpt4 key购买 nike

帮助组合多个网络调用并将结果累积在 Rxjava 中。 (我在 Android 应用程序中使用。)

State 
-- List<City> cityList;

City
- cityId;

RestCall 1
Observable<State> stateRequest = restService.getStates();

RestCall 2
Observable<CityDetail> cityRequest = restService.getCityDetail(cityId);

在 UI 中,我必须在获取每个城市的所有详细信息后显示城市列表,然后显示在 ListView 中。我如何实现并行网络调用并累积结果。 ?

我希望将所有城市详细信息结果放入源状态“对象”的列表中。由于状态对象也有一些信息需要显示。这可能吗?

stateRequest ??? 
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<State>() {
@Override
public void onCompleted() {

}

@Override
public void onError(Throwable e) {
}

@Override
public void onNext(State result) {
// Get city list and display
}
});

我检查了这个示例,它展示了我们如何压缩多个可观察到的响应。下面的代码 fragment 显示了 3 个组合的可观察量。但就我而言,我必须并行或顺序进行 20 个网络调用(我的意思是在后台但一个接一个)。我如何实现这一点。有什么帮助或指示吗?

https://gist.github.com/skehlet/9418379

Observable.zip(f3Observable, f4Observable, f5Observable, new Func3<String, Integer, Integer, Map<String, String>>() {
@Override
public Map<String, String> call(String s, Integer integer, Integer integer2) {
Map<String, String> map = new HashMap<String, String>();
map.put("f3", s);
map.put("f4", String.valueOf(integer));
map.put("f5", String.valueOf(integer2));
return map;
}

最佳答案

我认为您的代码可以简化为这样的代码,因为您对 zip 运算符的使用与 toList 运算符的使用很接近

 stateRequest
.subscribe(State state -> {
Observable.from(state.getCityList())
.flatMap(City city -> restService.getCityDetail(city.getId())
.toList()
.subscribe(List<City> cities -> {

state.clear();
state.addAll(cities);
});
});

由于 RxJava 不提供 throttle 运算符,你可以构建类似这样的东西:

Observable<City> limiter = Observable.zip(Observable.interval(1, SECONDS), aCity, (i, c) -> c);

使用这个,limiter 是一个 Observable,每秒发射一个城市。

因此,对于您的代码,如果您想限制对 getCityDetail 的调用,例如:

 Observable<Object> limiter = Observable.interval(1, SECONDS);
stateRequest
.subscribe(State state -> {
Observable.zip(limiter, Observable.from(state.getCityList()), (i, c) -> c)
.flatMap(City city -> restService.getCityDetail(city.getId())
.toList()
.subscribe(List<City> cities -> {

state.clear();
state.addAll(cities);
});
});

关于android - 编写多个网络调用 RxJava - Android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26695099/

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