在onNext()中没有传递任何内容的Observable

时间:2014-10-01 16:19:36

标签: java rx-java

我需要一个Observable,例如提供一个系统时钟,它不需要在onNext()中传递任何东西。我找不到允许我这样做的签名。

当然,我可以使用任何对象然后传递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();

            }

        })

6 个答案:

答案 0 :(得分:40)

如果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,因为您不需要它。

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

    }
}

如果我已经理解了你的要求,那么这应该可以解决问题。

答案 1 :(得分:37)

如果在调用onNext()之前需要将某些内容传递给onCompleted()

Observable.<Void>just(null)

如果您只需要调用onCompleted()

Observable.empty()

答案 2 :(得分:9)

RxJava 2 Wiki

  

RxJava 2.x不再接受空值,以下内容将产生   立即发出NullPointerException或作为下游信号。

     

...

     

这意味着Observable<Void>不能再发出任何值   只能正常终止或有例外。 API设计师可以   而是选择定义Observable<Object>而不保证什么   对象将是(无论如何都应该是无关紧要的)

这意味着您无法使用Void并执行Observable.just(null)

请改用Object或其他简单类型:

Observable.just(new Object());

答案 3 :(得分:2)

其中一个明智的解决方案是使用Observable<Boolean>

然后onNext(Boolean.TRUE)然后你忽略它。

但在这种情况下你可能不应该使用Observable 请考虑使用Completable代替

答案 4 :(得分:2)

从RxJava 2开始,正确的方法是使用sum((d[p]*Z[p]) for p in pairs)

From the docs

  

表示没有任何值但仅包含的延迟计算   完成或异常的指示。该班遵循类似   事件模式作为Reactive-Streams:onSubscribe(onError | onComplete)?

答案 5 :(得分:0)

我不知道这会对你有所帮助。
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()