web-dev-qa-db-fra.com

Observable qui ne passe rien dans onNext ()

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

            }

        })
36
Oliver Hausler

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.

40
Miguel Lavigne

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()
38
Mike Strobel

Wiki RxJava 2 :

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éfinir Observable<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());
9
mixel

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

2
Leo Droidcoder

À partir de RxJava 2, la meilleure façon de le faire est d'utiliser un Completable

À partir des documents :

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

2
AllDayAmazing

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()
0
Johnny