我需要一个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();
}
})
答案 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.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)
表示没有任何值但仅包含的延迟计算 完成或异常的指示。该班遵循类似 事件模式作为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()