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
我正在观察 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