我正在玩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);
});
这是给我一份送货清单。现在我想完成第二部分。
希望我已经足够清楚了。 感谢
答案 0 :(得分: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;
});
}
让我们一步一步走。
它工作正常而且非常好,我开始喜欢rxjava:)
答案 1 :(得分:1)
我没有花费大量时间使用Java 8 lambdas,但这里是将每个对象映射到另一个对象的示例,然后在另一端获取List<...>
普通的&#39; Java 7:
List<Delivery> deliveries = ...;
Observable.from(deliveries).flatMap(new Func1<Delivery, Observable<ETA>>() {
@Override
public Observable<ETA> call(Delivery delivery) {
// Convert delivery to ETA...
return someEta;
}
})
.toList().subscribe(new Action1<List<ETA>>() {
@Override
public void call(List<ETA> etas) {
}
});
当然,接受Retrofit响应(大概是Observable<List<Delivery>>
?)并且观察其中的每一个都很好。为此,我们理想地使用类似flatten()
的内容,doesn't appear to be coming to RxJava anytime soon。
要做到这一点,你可以做一些这样的事情(lambdas更好)。您可以使用以下内容替换上例中的Observable.from(deliveries)
:
apiService.getDeliveries().flatMap(new Func1<List<Delivery>, Observable<Delivery>>() {
@Override
public Observable<Delivery> call(List<Delivery> deliveries) {
return Observable.from(deliveries);
}
}).flatMap(...)