2016-07-06 4 views
3

Ich habe folgendes Szenario im Hinterkopf: Ich möchte einen Timer zählt, bis ich mich abmelden, aber ich möchte das onComplete-Signal bekommen, sobald ich mit dem letzten Wert stoppe.stop Observable.interval und senden onComplete

observable = Observable.interval(1, TimeUnit.SECONDS) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .doOnNext(new Action1<Long>() { 
       @Override 
       public void call(Long aLong) { 
        String duration = Utils.getDuration(startedTrackingTime, new Date().getTime()); 
        view.updateDurationTextView(duration); 
       } 
      }); 

    subscription = observable.subscribe(); 



public void stopMission() { 
     observable.doOnCompleted(new Action0() { 
      @Override 
      public void call() { 
       Log.d(TAG, "onCompleted: " + "timer"); 
      } 
     }); 

     subscription.unsubscribe(); 

Die doOnComplete nie aufgerufen. Ist es möglich mit RxJava zu arbeiten? Ich fühle, dass ich etwas falsch mache?

Antwort

3

@MatBos ist richtig, wenn Sie sich abmelden, können Sie keine Abschlussemission erwarten. Wenn Sie jedoch die beobachtbare früh aufhören wollen und bekommen es Sie füllen Sie das Intervall mit einem PublishSubject verschmelzen kann und eine Stop-Meldung durch das Objekt zu senden, wann immer Sie wollen:

PublishSubject<Long> subject = PublishSubject.create(); 
subject 
    .mergeWith(Observable.interval(1, TimeUnit.SECONDS)) 
    .takeWhile(n -> n != -1) 
    .doOnNext(System.out::println) 
    .doOnCompleted(() -> System.out.println("completed")) 
    .subscribe(); 
Thread.sleep(3100); 
subject.onNext(-1L); 
Thread.sleep(2000); 

Gibt:

0 
1 
2 
completed 
0

Definition des onComplete:

beobachtbares ruft diese Methode , nachdem es OnNext zum letzten Mal genannt hat, wenn es keine Fehler aufgetreten.

Wenn Sie sich abmelden, hören Sie nur auf, Emissionen zu empfangen. So kann das beobachtbare Objekt weiterhin über onNext emittieren oder Emissionen mit onComplete/onError-Benachrichtigung stoppen, aber Sie sagten nur, dass Sie nicht daran interessiert sind, was es aussendet, damit Sie es nicht erhalten.

1

Interval beobachtbar ist unendlich und wird daher nie abgeschlossen. Ich würde vorschlagen, doOnUnsubscribe für Ihren Stop-Callback anstelle von doOnCompleted zu verwenden.