3

I am facing with the problem. As far as I know zip method from RxJava waits for all observables to complete.

But am I getting another behaviour.

Here is my code snippet

 private PublishSubject<Void> firstSubject;
    private PublishSubject<Void> secondSubject;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        loadData();
        mDrawerHeaderView.postDelayed(new Runnable() {
            @Override
            public void run() {
              //  getSecondSubject().onNext(null);
            }
        }, 1000);
        mDrawerHeaderView.postDelayed(new Runnable() {
            @Override
            public void run() {
                getFirstSubject().onCompleted();
            }
        }, 1000);
    }

    protected PublishSubject<Void> createFirstSubject() {
        firstSubject = PublishSubject.create();
        return firstSubject;
    }

    protected PublishSubject<Void> createSecondSubject() {
        secondSubject = PublishSubject.create();
        return secondSubject;
    }

    protected PublishSubject<Void> getFirstSubject() {
        return firstSubject;
    }

    protected PublishSubject<Void> getSecondSubject() {
        return secondSubject;
    }

    private void loadData() {
        Observable<Void> firstSubject = createFirstSubject();
        Observable<Void> secondSubject = createSecondSubject();
        Observable<Boolean> allDataTask = Observable.zip(firstSubject, secondSubject, new Func2<Void, Void, Boolean>() {
            @Override
            public Boolean call(Void aVoid, Void aVoid2) {
                return true;
            }
        });
        allDataTask
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Subscriber<Boolean>() {
                    @Override
                    public void onCompleted() {
                        Notifications.showSuccessMessage(getApplicationContext(), "COMPLETE");
                    }

                    @Override
                    public void onError(Throwable e) {
                        Notifications.showErrorMessage(getApplicationContext(), "ERROR");

                    }

                    @Override
                    public void onNext(Boolean aBoolean) {
                        Notifications.showSuccessMessage(getApplicationContext(), "NEXT");
                    }
                });
    }

In this case I got COMPLETE message, but I was expecting to get nothing because the second subject is not completed. What I am doing wrong ? Please help me to get desired behaviour.

  • Possible duplicate of [Rx Java Observable execute until some condition](http://stackoverflow.com/questions/41856356/rx-java-observable-execute-until-some-condition) – Yaroslav Stavnichiy Jan 26 '17 at 07:10

1 Answers1

2

Yes, it works as expected. It makes perfect sense to receive the onCompleted() here, because if one stream is done, as long as all the elements it emitted are "zipped", there's no way to "zip" anything more, so it's "completed". You can also play with the sequence here.

xizzhu
  • 895
  • 6
  • 9