J'aurais besoin d'un Observable, par exemple pour fournir une horloge système, qui n'a besoin de rien passer dans onNext (). Je n'ai pas trouvé de signature qui me permettrait de le faire.
Bien sûr, je pourrais utiliser n'importe quel objet puis passer null, mais cela n'a pas beaucoup de sens. Ma question est donc de savoir s'il existe une meilleure façon de procéder.
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();
}
})
Vous n'avez pas besoin d'appeler onNext
si votre Observable
n'émet rien. Vous pouvez utiliser Void
dans votre signature et faire quelque chose comme
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());
}
});
Vous pouvez définir un OnCompletedObserver pour simplifier votre rappel Observer afin de ne pas avoir à remplacer le onNext car vous n'en avez pas besoin.
public abstract class OnCompletedObserver<T> implements Observer<T> {
@Override
public void onNext(T o) {
}
}
Si j'ai compris ce que vous demandez, cela devrait faire l'affaire.
Si vous avez besoin de transmettre quelque chose à onNext()
avant d'appeler onCompleted()
:
Observable.<Void>just(null)
Si vous avez seulement besoin d'appeler onCompleted()
:
Observable.empty()
RxJava 2.x n'accepte plus les valeurs nulles et ce qui suit produira NullPointerException immédiatement ou comme signal à l'aval.
...
Cela signifie que
Observable<Void>
Ne peut plus émettre de valeurs mais se termine uniquement normalement ou avec une exception. Les concepteurs d'API peuvent à la place choisir de définirObservable<Object>
Sans aucune garantie sur l'objet qui sera (ce qui ne devrait pas être pertinent de toute façon)
Cela signifie que vous ne pouvez pas utiliser Void
et faire Observable.just(null)
.
Utilisez à la place Object
ou un autre type simple:
Observable.just(new Object());
Une des solutions légères consiste à utiliser Observable<Boolean>
Et puis onNext(Boolean.TRUE)
que vous ignorez ensuite.
Mais vous ne devriez probablement pas utiliser Observable dans ce cas.
Envisagez d'utiliser Completable à la place
À partir de RxJava 2, la meilleure façon de le faire est d'utiliser un Completable
Représente un calcul différé sans aucune valeur mais seulement une indication de complétion ou d'exception. La classe suit un modèle d'événement similaire à Reactive-Streams: onSubscribe (onError | onComplete)?
Je ne sais pas si cela vous aidera ou non.
Le code écrit en 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)
Ou utilisez l'objet Variable
// 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()