我正在玩 RXJava,在 Android 中进行改造。我正在努力完成以下任务:
我需要定期轮询一个给我 Observable> 的调用(从这里我可以做到)
一旦我得到这个列表,我想在每个交付中迭代并调用另一个方法来给我预计到达时间(所以只是更多信息)我想将这个新信息附加到交付中并返回完整列表以及附加的额外信息每一个项目。
一旦获得列表,我知道如何在没有 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);
});
这是给我一份交货清单。现在我想完成第二部分。
希望我说得足够清楚。
谢谢
最后我找到了一个很好的方法来做到这一点。
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;
});
}
让我们一步一步来。
- 首先,我们创建一个 Observable,它会在每个 POLLING_INTERVAL 时间触发 getDeliveriesObs() 方法,该方法将返回最终列表
- 我们使用retrofit来获取调用的Observable
- 我们使用 flatMap 来展平结果列表,并在下一个 FlatMap 中逐一获取一个 Delivery 项目。
- 然后我们获取 Delivery 对象中设置的预计到达时间并将其返回
- 我们按照预计到达时间对列表进行排序。
- 如果出现错误,我们会打印并重试,这样间隔就不会停止
- 我们最终订阅以对列表进行排序并包含预计到达时间,然后我们只需将其返回或执行您需要对其执行的任何操作。
它工作正常并且非常好,我开始喜欢 rxjava :)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)