RxJava缓存网络调用



好的,所以我在一个项目上工作,我需要从服务器获得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 (network call1)
  • 为每个汽车id,找到真正的汽车
  • 从car id (network call2)获取汽车型号
  • 用汽车模型更新视图
  • 获取所有汽车id(网络呼叫3)
  • 对于每个汽车id,找到卡车
  • 从car id (network call4)获取卡车型号
  • 用卡车模型更新视图

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

我的问题是,有没有办法完成相同的,但通过缓存网络call1,而不是这个可怕的不可读的操作符链?

我不明白缓存是如何工作的,我怎么能把这个操作符应用到这个场景?

缓存正是你所需要的,下面是你如何使用它:

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

cache()将确保只执行一次订阅id(在第一次订阅时),并且为将来的订阅者保存其所有值。

相关内容

  • 没有找到相关文章

最新更新