Reputation: 11
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
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