不会调用Observer <void>的onNext和onComplete

时间:2017-03-01 06:58:35

标签: rx-java2

我是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");
      }
});

1 个答案:

答案 0 :(得分:2)

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