2017-11-23 1 views
0

Es gibt eine rx.Observable.timeout, aber es ist pro Element und nicht für alle Daten. Aber ich brauche eine Zeitüberschreitung, wenn Daten nicht innerhalb eines bestimmten Zeitraums ausgegeben werden.Festlegen eines Zeitlimits, bis die Daten von Observable

final Subscriber<Integer> sub = new Subscriber<Integer>() { 
      @Override 
      public void onNext(Integer num) { 


       try { 
        Thread.sleep(100); 
       } catch (InterruptedException e) {} 
       System.out.println(num); 
      } 

      @Override 
      public void onCompleted() { 
       System.out.println("--------------- Done ---------------"); 
      } 

      @Override 
      public void onError(Throwable e) { 
       //System.out.println("Error!!! + e"); 
      } 
     }; 

     Observable.range(1, 10000) 
     .map(x -> x * 10) 
     //.last() 
     .timeout(10, TimeUnit.SECONDS) 
     .doOnError(e -> {System.out.println("Errrorrr " + e);}) 
     .subscribe(sub); 

Antwort

1

Sie takeUntil(Observable) mit timer() in eine Ausnahme abgebildet verwenden:

source.takeUntil(
    Observable.timer(10, TimeUnit.SECONDS) 
    .flatMap(ignored -> Observable.error(new TimeoutException())) 
) 
.subscribe(/* ... */); 
+0

Das ist gut, danke – yuris

0

Verwenden Sie zwei Quellen: eine, die Ihre Daten ausgibt, eine, die Ihre Zeitüberschreitungsausnahme nach einer Verzögerung auslöst. Zusammenführen der beiden:

Observable timeoutObservable = Observable.error(new TimeoutException()) 
    .delay(10, TimeUnit.SECONDS, true); 
return Observable.merge(dataObservable, timoutObservable); 
+0

Nur so ist es für ein Problem nicht sehr elegante Lösung ist, sowieso, warum Verzögerung Methode? und es gibt keinen Booleschen Parameter für die Verzögerung ... – yuris

+0

hinzufügen Merge, Timeout nicht aufgerufen – yuris

+0

Ich bezog sich auf die Rxjava Javadoc. Unter der Annahme, dass Ihr dataObservable-Objekt abgeschlossen ist, dass das beobachtbare Zeitlimit den Fehler verzögert (war der Zweck des Booleschen Parameters), und dass der Merge-Operator abgeschlossen ist, wenn eine der Observablen abgeschlossen ist, sollte dies wie erwartet funktionieren. – cghislai

Verwandte Themen