RxJava 缓存网络调用
RxJava cache network calls
好的,我正在做一个项目,我需要从服务器获取 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,找到真正的汽车
- 从汽车id获取车型(网络调用2)
- 用汽车模型更新视图
- 获取所有汽车ID(网络调用3)
- 对于每个汽车 ID,找到卡车
- 从车号获取卡车型号(网络调用4)
- 使用卡车模型更新视图
所以,网络调用 1 和网络调用 3 是相同的,所以我应该重用它们,也就是说,我应该只调用一次并保存数据。这就是为什么 Rx-Operator 链在上面。
我的问题是,是否有任何方法可以完成相同的任务,但通过缓存网络调用 1 而不是这个可怕的不可读的运算符链?
我不明白缓存是如何工作的,我该如何将此运算符应用于这种情况?
cache 正是您所需要的,下面是您如何使用它:
cachedCarIds = getCarIds().cache();
cachedCarIds.map(this::getCarModelById).subscribe(... update car views);
cachedCarIds.map(this::getTruckModelById).subscribe(... update truck views);
cache()
将确保订阅 ID 只完成一次(在第一次订阅时),并为未来的订阅者保存它的所有值。
好的,我正在做一个项目,我需要从服务器获取 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,找到真正的汽车
- 从汽车id获取车型(网络调用2)
- 用汽车模型更新视图
- 获取所有汽车ID(网络调用3)
- 对于每个汽车 ID,找到卡车
- 从车号获取卡车型号(网络调用4)
- 使用卡车模型更新视图
所以,网络调用 1 和网络调用 3 是相同的,所以我应该重用它们,也就是说,我应该只调用一次并保存数据。这就是为什么 Rx-Operator 链在上面。
我的问题是,是否有任何方法可以完成相同的任务,但通过缓存网络调用 1 而不是这个可怕的不可读的运算符链?
我不明白缓存是如何工作的,我该如何将此运算符应用于这种情况?
cache 正是您所需要的,下面是您如何使用它:
cachedCarIds = getCarIds().cache();
cachedCarIds.map(this::getCarModelById).subscribe(... update car views);
cachedCarIds.map(this::getTruckModelById).subscribe(... update truck views);
cache()
将确保订阅 ID 只完成一次(在第一次订阅时),并为未来的订阅者保存它的所有值。