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)
这给了我一份交货清单.现在我想完成第二部分.
希望我足够清楚.谢谢
最后我找到了一个很好的方法来做到这一点。
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)
让我们一步一步来。
它工作正常并且非常好,我开始喜欢 rxjava :)
| 归档时间: |
|
| 查看次数: |
5361 次 |
| 最近记录: |