1

有两个事件——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();
    }
}
4

1 回答 1

1

您现有的解决方案具有竞争条件。您确实需要排队,以便按顺序处理事件。

处理的序列化可以使用PublishSubject只订阅一次的 a 来完成(比如在构造函数或初始化方法中)。代码如下所示:

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);
}
于 2018-11-21T01:15:14.953 回答