2016-09-21 6 views
0

Ich learing Rxjava im Moment und mit einem Fensterheber stecken bleiben. Ich teste den folgenden einfachen Code auf meinem Android-Gerät und bekomme verwirrende Ergebnisse.Rxjava Fenster() verwirrende Ergebnisse

Code:

Observable.interval(100, TimeUnit.MILLISECONDS) 
    .take(10) 
    .window(250, 100, TimeUnit.MILLISECONDS) 
    .flatMap(o -> o.toList()) 
    .subscribe(o -> Log.d(TAG, "object: "+o)); 

Manchmal habe ich, was ist wie richtige Ergebnisse für mich aussieht:

object: [0, 1] 
object: [0, 1, 2] 
object: [1, 2, 3] 
object: [2, 3, 4] 
object: [3, 4, 5] 
object: [4, 5, 6] 
object: [5, 6, 7] 
object: [6, 7, 8] 
object: [7, 8, 9] 
object: [8, 9] 
object: [9] 

Aber manchmal bekomme ich so etwas wie

object: [0, 1] 
object: [0, 1, 2] 
object: [1, 2, 3] 
object: [2, 3, 4] 
object: [3, 4, 5] 
object: [4, 5, 6] 
object: [6, 7] 
object: [6, 7, 8] 
object: [7, 8, 9] 
object: [8, 9] 
object: [9] 

Könnte jemand erklären, Warum sind die Ergebnisse für diesen Code unterschiedlich?

Antwort

0

Code wird nicht in kürzester Zeit ausgeführt. Wie Sie aus den Protokollen sehen können, gibt es kleine Unterschiede beim Emittieren eines onNext-Ereignisses, so dass es nicht genau gleichvielheit von 100 Millisekunden ist. Wenn Sie Fenster hinzufügen, sind die Operator-Lücken noch größer. In diesem Code ist es ein Grenzfall, dass unerwünschtes Verhalten verursachen könnte, wenn OnNext Ereignis

falsche Fenster trifft
Observable.interval(100, TimeUnit.MILLISECONDS) 
     .doOnNext(new Action1<Long>() { 
      @Override 
      public void call(Long aLong) { 
       Log.d(TAG, "ON NEXT TIME " + System.currentTimeMillis() % 10000); 
      } 
     }) 
     .take(10) 
     .window(250, 100, TimeUnit.MILLISECONDS) 
     .subscribe(new Action1<Object>() { 
      @Override 
      public void call(Object aLong) { 
       Log.d(TAG, "SUBSCRIBE TIME: " + System.currentTimeMillis() % 10000); 
      } 
     }); 

Logs ohne Fensterantrieb

SOME_TAG: ON NEXT TIME 8445 
SOME_TAG: SUBSCRIBE TIME: 8445 
SOME_TAG: ON NEXT TIME 8545 
SOME_TAG: SUBSCRIBE TIME: 8545 
SOME_TAG: ON NEXT TIME 8646 
SOME_TAG: SUBSCRIBE TIME: 8646 
SOME_TAG: ON NEXT TIME 8745 
SOME_TAG: SUBSCRIBE TIME: 8745 
SOME_TAG: ON NEXT TIME 8846 
SOME_TAG: SUBSCRIBE TIME: 8846 
SOME_TAG: ON NEXT TIME 8945 
SOME_TAG: SUBSCRIBE TIME: 8945 
SOME_TAG: ON NEXT TIME 9045 
SOME_TAG: SUBSCRIBE TIME: 9045 
SOME_TAG: ON NEXT TIME 9145 
SOME_TAG: SUBSCRIBE TIME: 9146 
SOME_TAG: ON NEXT TIME 9245 
SOME_TAG: SUBSCRIBE TIME: 9245 
SOME_TAG: ON NEXT TIME 9345 
SOME_TAG: SUBSCRIBE TIME: 9345 

Logs mit Fensterantrieb

SOME_TAG: ON NEXT TIME 7622 
SOME_TAG: SUBSCRIBE TIME: 7718 
SOME_TAG: ON NEXT TIME 7722 
SOME_TAG: SUBSCRIBE TIME: 7818 
SOME_TAG: ON NEXT TIME 7822 
SOME_TAG: SUBSCRIBE TIME: 7918 
SOME_TAG: ON NEXT TIME 7922 // THIS 
SOME_TAG: SUBSCRIBE TIME: 8018 
SOME_TAG: ON NEXT TIME 8023 // COMPARE WITH THIS 
SOME_TAG: SUBSCRIBE TIME: 8118 
SOME_TAG: ON NEXT TIME 8122 
SOME_TAG: SUBSCRIBE TIME: 8218 
SOME_TAG: ON NEXT TIME 8223 
SOME_TAG: SUBSCRIBE TIME: 8319 
SOME_TAG: ON NEXT TIME 8323 
SOME_TAG: SUBSCRIBE TIME: 8419 
SOME_TAG: ON NEXT TIME 8422 
SOME_TAG: SUBSCRIBE TIME: 8518 
SOME_TAG: ON NEXT TIME 8522