RxJava为项列表创建可观察链

时间:2016-12-29 12:58:07

标签: java android rx-java reactive-programming

如何在对列表中的所有项目执行webservice调用后返回将发出多个项目的observable?

所以我有一个网络服务,可以节省一个单一的“汽车”。我从UI中检索“汽车”列表,我想单独保存所有这些,但我只想订阅1 Observable。所以我基本上想要创建一些多个Observable链,这取决于从UI收到的“汽车”数量,我希望单个Observable发出的webservie的每个结果。一旦将所有“汽车”保存在网络服务中,单个Observable就可以完成。

3 个答案:

答案 0 :(得分:0)

我正在使用Retrofit来调用RxJava的Web服务,如下所示:

请求

Observable<ResponsePOJO> getCars(Param param);

调用getCars并处理响应:

client.getCars(param)
                .subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(Response -> {
                   // Success
                }, e -> {
                    // Error
                });

答案 1 :(得分:0)

我可能会误解,但这不是一个你可以从列表平面映射到单个项目的情况吗?

public Observable<Car> getCars() {
   return api.getCars()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .flatMap(new Func1<List<Car>, Observable<Car>>() {
                @Override public Observable<Car> call(List<Car> carlist) {
                    return Observable.from(carlist);
                }
            });
}

这样,onNext(Car car)将被多次调用,每当处理整个列表时,都会调用onCompleted()。在这个例子中,我使用网络作为我的列表的源,但我想这也可以是UI。

我希望这是你正在寻找的,否则,请详细说明,我会和你一起思考;)

答案 2 :(得分:0)

我认为您只需要使用Observable.form,如果您需要为每辆车创建一个Observable,只需使用flatMap运算符。 完成后,您只需订阅即可。

@Test
public void flatMapCars() {
    Observable.from(getCars())
            .flatMap(this::saveCar)
            .subscribe();
}

private List<String> getCars() {
    return Arrays.asList("Aston martin", "Renault", "Seat");
}

private Observable<String> saveCar(String car) {
    return Observable.just(car);//You should save the car
}