Предотвратить множественные вызовы метода с использованием rxjava - PullRequest
0 голосов
/ 21 ноября 2018

Существует два события - event1 и event2, которые могут вызвать getA(), эти два события могут произойти одновременно и вызвать getA.Я не хочу звонить getA несколько раз, пока это не будет сделано.Я использую isDisposed(), чтобы проверить, все еще ли он активен, и вызываю dispose() явно в doFinally и устанавливаю fetchADisposable как ноль.Есть ли лучший способ сделать это?

Одноразовые 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 голосов
/ 21 ноября 2018

Ваше существующее решение имеет условия гонки.Вам действительно нужно поставить в очередь, чтобы события обрабатывались последовательно.

Сериализация обработки может быть выполнена с использованием 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);
}
...