编程语言
首页 > 编程语言> > android-RxJava缓存网络调用

android-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(网络电话1)
>对于每个车号,找到真正的车
>从汽车ID(网络call2)获取汽车型号
>用汽车模型更新视图
>获取所有汽车ID(网络电话3)
>对于每个车号,找到卡车
>从汽车ID(网络电话4)获取卡车型号
>用卡车模型更新视图

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

我的问题是,有什么办法可以做到这一点,但是要缓存网络call1而不是这个可怕的,难以理解的操作符链?

我不了解缓存的工作方式,该如何将此运算符应用于这种情况?

解决方法:

cache正是您所需要的,这是您的用法:

cachedCarIds = getCarIds().cache();

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

cache()将确保订阅ID仅执行一次(第一次订阅时),并且其所有值都将保存以供将来的订阅者使用.

标签:rx-java,chain,android
来源: https://codeday.me/bug/20191119/2037986.html