2016-09-20 2 views
0

Meine Aufgabe ist es, den Teilnehmer anzurufen, wenn zwei oder mehr Ereignisse während der Zeitüberschreitung auftreten. Erstes Ereignis, das eine Zeitüberschreitung auslöst, wenn während der Zeitüberschreitung nichts passiert - es wird erneut mit der nächsten gestartet und so weiter. Ich verwende folgende Konstruktion:RxJava: zwei Anrufe während der Zeitüberschreitung

boolean trigger = false; 
    Observable.interval(...) 
    .filter(...) 
    .timeout(10, TU.SECONDS, Observable.just(false)) 
    .subscribe(par -> 
     if (par){ 
     if (trigger){ 
      twoTimesInTimeout(); 
     } else { 
      trigger = true; 
     } 
     } else { 
     trigger = false; 
     } 
    ) 

Vielleicht gibt es eine Möglichkeit, ohne Abzug zu gehen?

+0

Bitte klären. Was willst du passieren? Die "Trigger" -Variable ist sehr unfunktionell, d.h. gegen die Ziele von RxJava. Es gibt definitiv einen Weg, dies ohne diese Variable zu tun. Aber ich bin mir nicht sicher, was du zu tun versuchst. Vielleicht ein Beispiel hinzufügen. – Andy

+0

Ich habe eine Zeitüberschreitung, sagen wir 10 Sekunden. Dann habe ich ein Observable, das A | erzeugt B | C. Ich filtere Observable für A. Wenn ich zwei oder mehr A in 10 Sekunden habe, muss ich den Subscriber anrufen. –

+0

Aber es ist nicht wie ein 'buffer()', weil ich einen Timer brauche, der 'A' - abhängig ist. Es beginnt erst, wenn zuerst 'A' produziert wird. Wie ein Sicherheitssystem: Wenn es etwas Verdächtiges sieht, geht es für 10 Sekunden in den Warnmodus. Wenn in 10 Sekunden nichts passiert - beruhigt es sich. Wenn etwas passiert - der Wecker geht an. –

Antwort

0

Diese Methode sendet jede Emission erneut aus, wenn innerhalb einer bestimmten Anzahl von Millisekunden eine weitere Emission auftritt. Ich vergleiche die Zeit, in der jede nachfolgende Emission emittiert wird und emittiere, wenn das Zeitlimit erfüllt ist.

<T> Observable<T> emitIfWithin(Observable<T> obs, long millis){ 
    zip(obs.timestamp(), obs.skip(1).timestamp(), Pair::new) 
     .filter(pair -> pair.first.getTimestampMillis() - pair.first.getTimestampMillis() < millis) 
     .map(pair -> pair.first); 
} 

Und dann rufen Sie es mit Ihrem gewünschten Filter Wiederverwendung zu maximieren:

emitIfWithin(observable.ofType(A.class), 10000) 
    .subscribe(...); 
+0

Danke, sieht gut aus. Aber jetzt merke ich, dass ich nicht ganz ehrlich bin :(Ich brauche beide Ereignisse für meinen Algorithmus: es funktioniert wie ein Sicherheitssystem das ich beschrieben habe. 'Trigger = true;' ist nicht nur über den Trigger, sondern setzt das System in warning Modus, es ist mehr wie 'trigger = true; warnTheSystem();' Schande über mich :( –

+0

dann ersetzen Sie einfach 'map (...)' mit 'map (Paar -> neues Paar (pair.first.getValue(), pair.second.getValue())) 'und ändere den Rückgabetyp in' Observable > ' – Andy

+0

Aber würde es nicht warten, bis die zweite Emission die abgebildete' Paar'-Emission macht? Zum Beispiel ist die erste 00:10 Sek und zweitens um 00:15 Uhr wird mein Teilnehmer auf 00:15? –

Verwandte Themen