Android 对完全可观察对象重试

Android 对完全可观察对象重试,android,rx-java,Android,Rx Java,我有两个观测值。 1同步订单完成2获取所有订单。 我想一直同步产品,直到从后端获得所需的产品。这是每5分钟轮询后端5次以检索订单确认 apiService .syncOrders() .repeatWhen(new Func1<Observable<? extends Void>, Observable<?>>() { @Override public Observable<Integer> call(final

我有两个观测值。 1同步订单完成2获取所有订单。 我想一直同步产品,直到从后端获得所需的产品。这是每5分钟轮询后端5次以检索订单确认

 apiService
.syncOrders()
.repeatWhen(new Func1<Observable<? extends Void>, Observable<?>>() {
        @Override
        public Observable<Integer> call(final Observable<? extends Void> observable) {
            // Retry 5 more times with 5 seconds delay
            return observable.delay(5, TimeUnit.SECONDS).zipWith(Observable.range(START_RETRY,
                                                                                  MAX_RETRIES),
                                                                 new Func2<Void, Integer, Integer>() {
                                                                     @DebugLog
                                                                     @Override
                                                                     public Integer call(Void v,
                                                                                         Integer integer) {
                                                                         return integer;
                                                                     }
                                                                 });
        }
    }).andThen(apiService.streamOrders().flatMap(new Func1<List<Order>, Observable<Order>>() {
        @Override
        public Observable<Order> call(List<Order> orderList) {
            return Observable.from(orderList);
        }
    }).filter(new Func1<Order, Boolean>() {
        @DebugLog
        @Override
        public Boolean call(Order order) {
            return order.orderRef() == orderId;
        }
    }).first());
重复正常完成的完成表不会触发,而且永远不会触发。您必须重新设计您的流程,例如,运行一个5分钟周期的Observable.interval,将其值平面映射到第一个completable中,然后附加到该内部流程中,例如:

Observable.interval(0, 5, TimeUnit.MINUTES)
.onBackpressureLatest()
.flatMap(tick -> 
     apiService.syncOrders()
     .andThen(apiService.streamOrders().flatMapIterable(list -> list))
     .retryWhen(error -> error.delay(5, TimeUnit.SECONDS))
)
.filter(v -> ...)
.subscribe(...);

怎么样?我尝试了一下,但这将在apiService.streamOrders上进行重试。如果流中没有找到订单,我想尝试再次同步。