2014-10-01 14 views
27

Avrei bisogno di un Osservabile, ad esempio per fornire un orologio di sistema, che non ha bisogno di passare nulla in onNext(). Non sono riuscito a trovare una firma che mi permettesse di farlo.Osservabile che non passa nulla in onNext()

Certo, potrei usare qualsiasi oggetto e quindi passare null, ma questo non ha molto senso. Quindi la mia domanda è se c'è un modo migliore per farlo.

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

Così si vuole solo chiamare onNext() senza alcun argomento? –

+1

Nota per gli altri che arrivano qui, 'onNext (null)' non è ok nonostante le altre risposte e commenti. Vedi [le specifiche] (https://github.com/reactive-streams/reactive-streams-jvm/blob/v1.0.0/README.md#2-subscriber-code). Vedi anche [questo problema] (https: // github.it/ReactiveX/RxJava/issues/4644) in RxJava. –

risposta

36

Non è necessario chiamare onNext se il Observable non emette nulla. Si potrebbe utilizzare Void nella tua firma e fare qualcosa di simile

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()); 
    } 
}); 

È possibile definire un OnCompletedObserver per semplificare il callback Observer in modo che non si deve ignorare l'onNext dal momento che non ne hai bisogno.

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

    } 
} 

Se ho capito cosa stai chiedendo, questo dovrebbe fare il trucco.

+0

Voglio che il mio Observable emetta qualcosa, che è il segno di spunta regolare, anche se questo tick non porta nient'altro che il momento nel tempo (che non richiede che un oggetto venga passato). Il trucco con l'uso di Void è bello, ma suppongo che non possa passare nulla in onNext (void) poichè Void non può essere istanziato. Posso passare nulla, però, quindi fa il lavoro bene. Grazie! –

+0

Sì, hai ragione, puoi semplicemente usare "null" in quel caso. –

+0

@MiguelLavigne puoi gentilmente aggiornare la tua risposta? So che funziona bene, ma visti i recenti aggiornamenti dell'API, forse possiamo implementarlo in modi diversi ma più eleganti? Grazie! – beerBear

31

Se avete bisogno di qualcosa da passare al onNext() prima onCompleted() si chiama:

Observable.<Void>just(null) 

Se solo bisogno onCompleted() di essere chiamato:

Observable.empty() 
0

Non so questa volontà ti aiuta o no.
Il codice scritto in RxSwift.

// 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) 

Oppure utilizzare l'oggetto variabile

// 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

È possibile sostituire Void() con() – dduyduong

1

RxJava 2 Wiki:

RxJava 2.x non accetta valori nulli e la seguente produrrà immediatamente o come segnale a valle NullPointerException .

...

Ciò significa che Observable<Void> può più emettere alcun valore ma solo terminare normalmente o con un'eccezione. API progettisti possono invece scegliere di definire Observable<Object> senza alcuna garanzia su quello che sarà Object (che dovrebbe essere comunque irrilevante)

Ciò significa che non è possibile utilizzare Void e fare Observable.just(null).

Usa Object o qualche altro tipo semplice invece:

Observable.just(new Object());