RxJava +改造,获取List并为每个项目添加额外信息

Mar*_*cel 5 android polling observable rx-java retrofit

我正在玩RXJava,在Android中进行改造.我正在努力完成以下任务:

我需要定期轮询一个给我一个Observable的调用>(从这里我可以做到)

一旦我得到这个列表,我想迭代每个交付,并调用另一个方法,将给我ETA(所以只是更多信息)我想将这个新信息附加到交付,并返回完整列表与附加的额外信息每个物品.

一旦得到列表,我知道如何在没有rxjava的情况下做到这一点,但我想练习.

到目前为止这是我的代码:

pollDeliveries = Observable.interval(POLLING_INTERVAL, TimeUnit.SECONDS, Schedulers.from(AsyncTask.THREAD_POOL_EXECUTOR))
            .map(tick -> RestClient.getInstance().getApiService().getDeliveries())
                    .doOnError(err -> Log.e("MPB", "Error retrieving messages" + err))
                    .retry()
                    .subscribe(deliveries -> {
                        MainApp.getEventBus().postSticky(deliveries);
                    });
Run Code Online (Sandbox Code Playgroud)

这给了我一份交货清单.现在我想完成第二部分.

希望我足够清楚.谢谢

Mar*_*cel 4

最后我找到了一个很好的方法来做到这一点。

private void startPolling() {
    pollDeliveries = Observable.interval(POLLING_INTERVAL, TimeUnit.SECONDS, Schedulers.from(AsyncTask.THREAD_POOL_EXECUTOR))
            .flatMap(tick -> getDeliveriesObs())
            .doOnError(err -> Log.e("MPB", "Error retrieving messages" + err))
            .retry()
            .subscribe(this::parseDeliveries, Throwable::printStackTrace);
}

private Observable<List<Delivery>> getDeliveriesObs() {
    return RestClient.getInstance().getApiService().getDeliveries()
            .flatMap(Observable::from)
            .flatMap(this::getETAForDelivery)
            .toSortedList((d1, d2) -> {
                if (d1.getEta() == null) {
                    return -1;
                }
                if (d2.getEta() == null) {
                    return 1;
                }
                return d1.getEta().getDuration().getValue() > d2.getEta().getDuration().getValue() ? 1 : -1;
            });
}
Run Code Online (Sandbox Code Playgroud)

让我们一步一步来。

  1. 首先,我们创建一个 Observable,它会在每个 POLLING_INTERVAL 时间触发 getDeliveriesObs() 方法,该方法将返回最终列表
  2. 我们使用retrofit来获取调用的Observable
  3. 我们使用 flatMap 来展平结果列表,并在下一个 FlatMap 中逐一获取交付项。
  4. 然后我们获取 Delivery 对象中设置的预计到达时间并将其返回
  5. 我们按照预计到达时间对列表进行排序。
  6. 如果出现错误,我们会打印并重试,这样间隔就不会停止
  7. 我们最终订阅以对列表进行排序并包含预计到达时间,然后我们只需将其返回或执行您需要对其执行的任何操作。

它工作正常并且非常好,我开始喜欢 rxjava :)