RxJava缓存网络调用

时间:2015-09-25 11:10:24

标签: android rx-java chain

好的,所以我正在开发一个项目,我需要从服务器获取Json,获取相应的POJO,填写一些视图并结束。

我面临的问题是,我必须嵌套网络呼叫以获取我需要的最终数据。并且为了最小化网络调用,我必须重用它们,这导致非常复杂的RxOperator链。例如:

getCarId() // network call
   .flatMap(carIdObj -> getCarModelById(carIdObj)
                           .doOnNext(... update car views)
                           .flatMap(carModelObj -> { return carIdObj;}     
   .flatMap(carIdObj --> getTruckModelById(carIdObj)
                           .doOnNext(... update truck views)
                           .flatMamp(truckModelObj -> { return carIdObj; }

解释运营商链(这是一个例子)

  • 获取所有汽车ID(网络电话1)
  • 为每辆车识别,找到真正的汽车
  • 从汽车ID(网络电话2)获取汽车模型
  • 使用汽车模型更新视图
  • 获取所有汽车ID(网络电话3)
  • 为每辆车识别,找到卡车
  • 从汽车识别码(网络电话4)获取卡车型号
  • 使用卡车型号更新视图

因此,网络call1和网络调用3是相同的,所以我应该重用它们,这意味着,我应该只调用一次并保存数据。这就是为什么Rx-Operator链接在上面。

我的问题是,有没有办法实现相同的目标,但通过缓存网络call1而不是这个可怕的不可读的运营商链?

我不明白缓存是如何工作的,如何将此运算符应用于此场景?

1 个答案:

答案 0 :(得分:3)

cache正是您所需要的,以下是您使用它的方式:

cachedCarIds = getCarIds().cache();

cachedCarIds.map(this::getCarModelById).subscribe(... update car views);
cachedCarIds.map(this::getTruckModelById).subscribe(... update truck views);

cache()将确保订阅ID仅执行一次(首次订阅时),并保存所有值以供将来订阅者使用。