订户 OnComplete 调用了两次

Subscriber OnComplete called twice

为什么 #onComplete() 被调用了两次,而 #addSomething() 只被调用了一次?这是代码片段:

private void addSomething() {
            Subscriber<AddCommentResponse> subscriber = createSubscriber();

            NetworkService.getIp()
                    .subscribeOn(Schedulers.io())
                    .flatMap(addSomethingService)
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(subscriber);
        }

        private Subscriber<AddCommentResponse> createSubscriber() {
            return new Subscriber<AddCommentResponse>() {
                @Override
                public void onCompleted() {
                    this.unsubscribe();

                    Toast.makeText(
                            MyApplication.context, getString(R.string.toast_comment_added_successfully), Toast.LENGTH_LONG
                    ).show();
                    navigateBack();
                }    

                @Override
                public void onNext(AddCommentResponse response) {
                    onCompleted();                        
                }
            };

RxJava 遵循这个约定:它会调用你的观察者 onNext,然后用 onComplete 或 onError 调用结束你的流。

您不必这样做。 RX 会为您完成。

  • 从 onNext 方法中删除 onComplete() 调用:它没有用,但会解决您的问题。
  • createSubscribe 应该 return 一个观察者。订阅者是具有不同含义的观察者。 (订阅方法参数是Observer)