RxJava2 emitter.setCancellable 在第二次触摸时取消按钮点击监听器

RxJava2 emitter.setCancellable cancels button click listener on second touch

我正在观察 2 个按钮上的点击侦听器,以增加或减少下方观察者的计数器

            observer = new Observer<Long>() {
                @Override
                public void onSubscribe(Disposable disposable) {
                    compositeDisposable.add(disposable);
                }

                @Override
                public void onNext(Long value) {
//                System.out.println(" mObserver onNext() int: " + value);
                    dataBinding.text1.setText("Observer onNext() int: " + value);

                }

                @Override
                public void onError(Throwable e) {
                    dataBinding.text1.setText("Observer onError() e: " + e.getMessage());

                }

                @Override
                public void onComplete() {
                    dataBinding.text1.setText("Observer onComplete()");
                }
            };
        }

我添加到按钮的观察对象之一是这个

Observable<View> viewObservableMinus = Observable.create(emitter ->

            dataBinding.buttonMinus.setOnClickListener(view -> {

                System.out.println("Inside onClickListener");

                emitter.onNext(view);

                emitter.setCancellable(() ->{
                    System.out.println(" dataBinding.buttonMinus emitter.setCancellable()");
                    view.setOnClickListener(null);
                } );

            }));

    viewObservableMinus.map(view -> (long) --mCounter).subscribe(observer);

当我触摸按钮两次时,我收到以下消息,点击侦听器设置为空,为什么它设置为 null?顺便说一句,如果不使用 setCancellable,它工作正常。

I: Inside onClickListener
I: Inside onClickListener
I:  dataBinding.buttonMinus emitter.setCancellable()

来自文档:

void setCancellable(@Nullable Cancellable c) Sets a Cancellable on this emitter; any previous Disposable or Cancellable will be disposed/cancelled.

基本上,当您第二次调用 setCancellable() 时,有另一个与发射器相关联的 Cancellable,应用程序将在之前添加的第一个 Cancellable 上调用 dispose,然后添加新的 Cancellable。

编辑:您需要将代码更改为类似的代码以仅设置一次可取消,而不是每次单击按钮时都可能。

   Observable viewObservableMinus = Observable.create(emitter ->
            emitter.setCancellable(() ->{
                System.out.println(" dataBinding.buttonMinus emitter.setCancellable()");
                view.setOnClickListener(null);
            });    

            dataBinding.buttonMinus.setOnClickListener(view -> {
                System.out.println("Inside onClickListener");

                emitter.onNext(view);
            }));

    viewObservableMinus.map(view -> (long) --mCounter).subscribe(observer);

参考: http://reactivex.io/RxJava/javadoc/io/reactivex/ObservableEmitter.html