Android Developer
Android Developer

Reputation: 11

Prevent multiple calls to the method using rxjava

There are two events - event1 and event2 which can call getA(), these two events could occur simultaneously and trigger getA. I don't want to call getA multiple times until it gets done. I am using isDisposed() to check if its still active and calling dispose() explicitly in doFinally and setting fetchADisposable as null . Is there a better way to do this ?

Disposable 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();
    }
}

Upvotes: 1

Views: 857

Answers (1)

Dave Moten
Dave Moten

Reputation: 12097

Your existing solution has race conditions. You really need queuing to take place so that the events are processed serially.

The serialization of processing can be done using a PublishSubject that is subscribed to once only (say in the constructor or in an initializer method). The code looks like:

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

Upvotes: 1

Related Questions