有两个事件-event1
和event2
可以调用getA()
,这两个事件可以同时发生并触发getA
。我不想多次致电getA
直到完成。我正在使用isDisposed()
来检查其是否仍处于活动状态,并在dispose()
中显式调用doFinally
并将fetchADisposable设置为null。有更好的方法吗?
一次性fetchADisposable;
public void getA() {
fetchA() //returns Observable
.doFinally(new Action() {
fetchADisposable.dispose();
fetchADisposable = null;
}).subscribe() {
@Override
public void onSubscribe (Disposable d){
fetchADisposable = d;
}
@Override
public void onNext () {
}
@Override
public void onError (Throwable e){
}
@Override
public void onComplete () {
}
}
}
public void event1() {
if (fetchADisposable == null || fetchADisposable.isDisposed()) {
getA();
}
}
public void event2() {
if (fetchADisposable == null || fetchADisposable.isDisposed()) {
getA();
}
}
答案 0 :(得分:1)
您现有的解决方案具有竞争条件。您确实需要进行排队,以便按顺序处理事件。
可以使用仅预订一次的PublishSubject
(例如在构造函数或初始化方法中)进行处理的序列化。代码如下:
final PublishSubject<Integer> subject = createSubject();
private static PublishSubject<Integer> createSubject() {
PublishSubject<Integer> subject = PublishSubject.<Integer>create().serialized();
subject.subscribe(subscriber);
}
public void getA() {
subject.onNext(1);
}