web-dev-qa-db-ja.com

onNext()で何も渡さないObservable

たとえば、onNext()で何も渡す必要のないシステムクロックを提供するために、Observableが必要です。それを可能にする署名を見つけることができませんでした。

もちろん、任意のオブジェクトを使用してからnullを渡すこともできますが、それはあまり意味がありません。したがって、私の質問は、それを行うより良い方法があるかどうかです。

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

onNextが何も出力しない場合、Observableを呼び出す必要はありません。署名でVoidを使用して、次のようにすることができます

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

OnCompletedObserverを定義して、Observerコールバックを単純化することができます。これにより、onNextが必要ないため、onNextをオーバーライドする必要がなくなります。

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

    }
}

あなたが何を求めているのか理解できたら、これでうまくいくはずです。

40
Miguel Lavigne

onNext()が呼び出される前にonCompleted()に何かを渡す必要がある場合:

_Observable.<Void>just(null)
_

onCompleted()の呼び出しのみが必要な場合:

_Observable.empty()
_
38
Mike Strobel

RxJava 2 Wiki

RxJava 2.xはnull値を受け入れなくなり、以下はすぐに、またはダウンストリームへのシグナルとしてNullPointerExceptionを生成します。

...

これは、_Observable<Void>_が値を出力できなくなり、正常に終了するか、例外が発生することを意味します。 APIデザイナーは、代わりに_Observable<Object>_を定義することを選択できますが、Objectが何であるかは保証されません(とにかく無関係なはずです)

Voidを使用してObservable.just(null)を実行できないことを意味します。

代わりにObjectまたは他の単純なタイプを使用してください。

_Observable.just(new Object());
_
9
mixel

軽い解決策の1つは、_Observable<Boolean>_を使用することです

そして、onNext(Boolean.TRUE)を無視します。

ただし、その場合はObservableを使用しないでください。
代わりに Completable を使用することを検討してください

2
Leo Droidcoder

RxJava 2以降、これを行う適切な方法はCompletableを使用することです

ドキュメントから

値なしの遅延計算を表しますが、完了または例外を示すだけです。クラスは、Reactive-Streamsと同様のイベントパターンに従います。onSubscribe(onError | onComplete)?

2
AllDayAmazing

これがあなたの役に立つかどうかはわかりません。
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)

または、変数オブジェクトを使用します

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