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

标签 android system.reactive rx-java

帮助组合多个网络调用并将结果累积在 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/

相关文章:

java - 条件运行时程序停止

ANDROID linearlayout 使用权重填充剩余空间

c# - 为什么可以等待 Rx observable?

c# - 缓冲 PropertyChanged 事件

java - 按日期对对象列表进行分组并使用 rxjava 对它们进行时间排序

java - 如何中断已发布的 Flowable

android - GC_FOR_ALLOC 释放 6346K, 7% free , paused 143ms, total 143ms

java - 我想从以下 HashMap 中获取常见时间集的工作日

system.reactive - 是否有 Rx 运算符用于仅在流 2 发出事物时组合来自流 1 和 2 的最新数据?

java - 忽略 Observable<Single<T>> 中的错误