RxJava 2嵌套网络请求

时间:2018-03-10 15:20:03

标签: android retrofit2 rx-java2 flatmap

在我正在处理的应用中,我使用改造来创建Observable <ArrayList<Party>>

PartyhostId字段以及类型User的字段,在Retrofits GsonConverter创建时为空。我现在想要使用hostId发出第二个请求,让用户从id获取并将User添加到初始Party。我一直在研究flatmap,但我还没有找到一个例子,其中第一个observable的结果不仅保留了,而且还被修改。

目前,为了让所有参与者都没有User我正在做的事情:

Observable<ArrayList<Party>> partiesObs = model.getParties();

partiesObs.subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(this::handlePartyResponse, this::handleError);

如何在每个User添加Party,而无需在初始调用的model.getUsers()方法中调用onSuccess(),然后必须遍历两个列表?

我理解flatmap()会返回一个新的Observable而map没有,但我不确定如何在这种情况下使用它。

谢谢

1 个答案:

答案 0 :(得分:0)

与评论一样,您应该尝试更改后端API,以避免使用不合适且效率低下的解决方案。

如果这不可行,你可能会这样做:

    .flatMapIterable(list -> list)
    .flatMap(party -> model.getUser(party.hostId),
            (party, user) -> new Party(user, party.hostId, party.dontCare))

其中:

  1. flatMapIterableObservable<ArrayList<Party>>展平为Observable<Party>
  2. flatMap的重载需要Function来将排放(Party个对象)转换为ObservableSourceUser个对象)作为第一个参数。第二个参数是BiFunction,用于组合PartyUser个对象,您可以使用这些对象创建完全成熟的Party对象。
  3. 如果您对copy对象执行了cloneParty操作,那么最后一步会更容易,该操作会占用前一个实例并为其添加字段。