防止使用rxjava多次调用该方法

时间:2018-11-20 23:55:32

标签: rx-java rx-java2 rx-javafx

有两个事件-event1event2可以调用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();
    }
}

1 个答案:

答案 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);
}