Observer<Void> 的 onNext 和 onComplete 没有被调用
Observer<Void>'s onNext and onComplete are not be called
我是 RxJAVA 的初学者。我想将初始化作业分配给另一个线程并在完成时通知我,以便我可以开始工作。因为这个 Observable 没有任何数据要发射,所以我使用 this topic 中讨论的 Void 类型。但是如果我使用 Void 类型,我的 Observer 的 onNext 和 onComplete 将不起作用,我尝试使用 String 代替并且它工作正常。我想问一下我应该在这种情况下使用 Void 还是 RxJAVA 有更好的方法来满足这种需求?这是我的代码:
Observable.create(new ObservableOnSubscribe<Void>() {
@Override
public void subscribe(ObservableEmitter<Void> e) throws Exception {
initialize();
e.onNext(null);
e.onComplete();
}
}).subscribeOn(Schedulers.computation()).subscribe(new Observer<Void>() {
@Override
public void onSubscribe(Disposable d) {}
@Override
public void onComplete() {
Log.d(TAG, "Test RxJAVA, onComplete");
}
@Override
public void onError(Throwable e) {
Log.d(TAG, "Test RxJAVA, onError");
}
@Override
public void onNext(Void noData) {
Log.d(TAG, "Test RxJAVA, onNext");
}
});
编辑
编辑@JohnWowUs 的答案。效果很好,谢谢。
Completable.fromCallable(new Callable<Void>() {
@Override
public Void call() throws Exception {
initialize();
}
}).subscribeOn(Schedulers.computation())
.subscribe(new CompletableObserver() {
@Override
public void onSubscribe(Disposable d) {}
@Override
public void onComplete() {
Log.d(TAG, "Test RxJAVA, onComplete");
}
@Override
public void onError(Throwable error) {
Log.d(TAG, "Test RxJAVA, onError");
}
});
RxJava 不再接受空值。参见 here。在这种情况下,您应该使用 Completable
。像
Completable.fromCallable(new Callable<Void>() {
@Override
public Void call() throws Exception {
initialize();
return null;
})
.subscribe(new CompletableObserver<Void>() {
@Override
void onSubscribe(Disposable d) {
}
@Override
void onComplete() {
Log.d(TAG, "Test RxJAVA, onComplete");
}
@Override
void onError(Throwable error) {
Log.d(TAG, "Test RxJAVA, onError");
});
我是 RxJAVA 的初学者。我想将初始化作业分配给另一个线程并在完成时通知我,以便我可以开始工作。因为这个 Observable 没有任何数据要发射,所以我使用 this topic 中讨论的 Void 类型。但是如果我使用 Void 类型,我的 Observer 的 onNext 和 onComplete 将不起作用,我尝试使用 String 代替并且它工作正常。我想问一下我应该在这种情况下使用 Void 还是 RxJAVA 有更好的方法来满足这种需求?这是我的代码:
Observable.create(new ObservableOnSubscribe<Void>() {
@Override
public void subscribe(ObservableEmitter<Void> e) throws Exception {
initialize();
e.onNext(null);
e.onComplete();
}
}).subscribeOn(Schedulers.computation()).subscribe(new Observer<Void>() {
@Override
public void onSubscribe(Disposable d) {}
@Override
public void onComplete() {
Log.d(TAG, "Test RxJAVA, onComplete");
}
@Override
public void onError(Throwable e) {
Log.d(TAG, "Test RxJAVA, onError");
}
@Override
public void onNext(Void noData) {
Log.d(TAG, "Test RxJAVA, onNext");
}
});
编辑 编辑@JohnWowUs 的答案。效果很好,谢谢。
Completable.fromCallable(new Callable<Void>() {
@Override
public Void call() throws Exception {
initialize();
}
}).subscribeOn(Schedulers.computation())
.subscribe(new CompletableObserver() {
@Override
public void onSubscribe(Disposable d) {}
@Override
public void onComplete() {
Log.d(TAG, "Test RxJAVA, onComplete");
}
@Override
public void onError(Throwable error) {
Log.d(TAG, "Test RxJAVA, onError");
}
});
RxJava 不再接受空值。参见 here。在这种情况下,您应该使用 Completable
。像
Completable.fromCallable(new Callable<Void>() {
@Override
public Void call() throws Exception {
initialize();
return null;
})
.subscribe(new CompletableObserver<Void>() {
@Override
void onSubscribe(Disposable d) {
}
@Override
void onComplete() {
Log.d(TAG, "Test RxJAVA, onComplete");
}
@Override
void onError(Throwable error) {
Log.d(TAG, "Test RxJAVA, onError");
});