订阅者OnComplete调用了两次

时间:2015-04-05 21:46:45

标签: android observable rx-java

为什么#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();                        
                }
            };

1 个答案:

答案 0 :(得分:3)

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

你不必这样做。 RX会为你做的。

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