2014-10-01 2 views
27

Ich würde ein Observable benötigen, um zum Beispiel eine Systemuhr bereitzustellen, die nichts in onNext() übergeben muss. Ich konnte keine Unterschrift finden, die mir erlauben würde, das zu tun.Observable, was nichts übergibt onNext()

Sicher, ich könnte jedes Objekt verwenden und dann Null übergeben, aber das macht nicht viel Sinn. Also meine Frage ist, ob es einen besseren Weg gibt, das zu tun.

Observable.create(new Observable.OnSubscribe<Anyobject>() { // use any object in the signature 

      @Override public void call(Subscriber<? super Anyobject> subscriber) { 

        subscriber.onNext(null); // then pass null 
        subscriber.onCompleted(); 

      } 

     }) 
+0

So möchten Sie gerade OnNext() ohne Argumente nennen? –

+1

Hinweis für andere, die hierher kommen, 'onNext (null)' ist nicht in Ordnung, trotz was andere Antworten und Kommentare sagen. Siehe [die Spezifikation] (https://github.com/reactive-streams/reactive-streams-jvm/blob/v1.0.0/README.md#2-subscriber-code). Siehe auch [dieses Problem] (https: // github.com/ReactiveX/RxJava/Probleme/4644) in RxJava. –

Antwort

36

Sie brauchen nicht onNext zu nennen, wenn Ihr Observable nichts emittieren. Sie könnten Void in Ihrer Signatur verwenden und so etwas wie

Observable<Void> o = Observable.create(new Observable.OnSubscribe<Void>() { 
    @Override 
    public void call(Subscriber<? super Void> subscriber) { 
     // Do the work and call onCompleted when you done, 
     // no need to call onNext if you have nothing to emit 
     subscriber.onCompleted(); 
    } 
}); 

o.subscribe(new OnCompletedObserver<Void>() { 
    @Override 
    public void onCompleted() { 
     System.out.println("onCompleted"); 
    } 

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

Sie einen OnCompletedObserver definieren können Ihre Observer Rückruf zu vereinfachen, so dass Sie die OnNext nicht außer Kraft setzen müssen, da Sie es nicht brauchen.

public abstract class OnCompletedObserver<T> implements Observer<T> { 
    @Override 
    public void onNext(T o) { 

    } 
} 

Wenn ich verstanden habe, was Sie fragen, dann sollte dies den Trick tun. Wenn Sie nur onCompleted() müssen genannt werden

Observable.<Void>just(null) 

:

Observable.empty() 
+0

Ich möchte, dass mein Observable etwas emittiert, was das normale Tick ist, auch wenn dieses Häkchen nichts anderes als den Moment enthält (der kein Objekt erfordert). Der Trick bei der Verwendung von Void ist nett, aber ich denke, ich kann in onNext (void) nicht void passieren, da Void nicht instanziiert werden kann. Ich kann jedoch null vergeben, also macht es den Job gut. Vielen Dank! –

+0

Ja, Sie haben Recht, Sie können einfach 'null' in diesem Fall verwenden. –

+0

@MiguelLavigne können Sie bitte Ihre Antwort aktualisieren? Ich weiß, es funktioniert gut, aber angesichts der jüngsten API-Updates können wir das vielleicht auf andere, aber elegantere Weise umsetzen? Vielen Dank! – beerBear

31

Wenn Sie etwas brauchen, um onNext() vor onCompleted() weitergegeben werden aufgerufen oder nicht.
Der Code in RxSwift geschrieben.

// Create an observable and emit somethings 
let myObservable = Observable<Void>.create{ observer in 
    observer.on(.next(Void())) 
    return Disposables.create() 
} 

// Observer subscribe changes 
myObservable.subscribe(onNext: { 
    _ in 
    print("Hello") 
}).disposed(by: disposeBag) 

Oder verwenden, um die Variable Objekt

// Create a Variable object that contanins nothing 
var myValueWatcher:Variable<Void> = Variable<Void>(Void()) 

// Observer subscribe changes 
myValueWatcher.asObservable().skip(1).subscribe(onNext: { 
    _ in 
    print("Changes!") 
}).disposed(by: disposeBag) 


// The emit code 
myValueWatcher.value = Void() 
0

Ich weiß nicht, dies wird Ihnen hilft

+0

Sie können Void() durch() ersetzen – dduyduong

1

RxJava 2 Wiki:

RxJava 2.x akzeptiert keine Nullwerte und die folgende Nullpointer sofort oder als Signal an nachgelagerte ergeben wird .

...

Dies bedeutet, dass nicht mehr alle Observable<Void> Werte abgeben kann, sondern nur normal oder mit einer Ausnahme beenden. API-Designer können statt Observable<Object> ohne Garantie auf definieren wählen, was Objekt wird

Es bedeutet (das sollte sowieso irrelevant sein), dass Sie nicht Void und Observable.just(null) tun können.

Verwenden Object oder eine andere einfache Art statt:

Observable.just(new Object());