Prevent multiple calls to the method using rxjava











up vote
0
down vote

favorite












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









share|improve this question







New contributor




Android Developer is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
























    up vote
    0
    down vote

    favorite












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









    share|improve this question







    New contributor




    Android Developer is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
    Check out our Code of Conduct.






















      up vote
      0
      down vote

      favorite









      up vote
      0
      down vote

      favorite











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









      share|improve this question







      New contributor




      Android Developer is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.











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






      rx-java rx-java2 rx-javafx






      share|improve this question







      New contributor




      Android Developer is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.











      share|improve this question







      New contributor




      Android Developer is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.









      share|improve this question




      share|improve this question






      New contributor




      Android Developer is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.









      asked Nov 20 at 23:55









      Android Developer

      1




      1




      New contributor




      Android Developer is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.





      New contributor





      Android Developer is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.






      Android Developer is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.
























          1 Answer
          1






          active

          oldest

          votes

















          up vote
          1
          down vote













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





          share|improve this answer





















            Your Answer






            StackExchange.ifUsing("editor", function () {
            StackExchange.using("externalEditor", function () {
            StackExchange.using("snippets", function () {
            StackExchange.snippets.init();
            });
            });
            }, "code-snippets");

            StackExchange.ready(function() {
            var channelOptions = {
            tags: "".split(" "),
            id: "1"
            };
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function() {
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled) {
            StackExchange.using("snippets", function() {
            createEditor();
            });
            }
            else {
            createEditor();
            }
            });

            function createEditor() {
            StackExchange.prepareEditor({
            heartbeatType: 'answer',
            convertImagesToLinks: true,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: 10,
            bindNavPrevention: true,
            postfix: "",
            imageUploader: {
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            },
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            });


            }
            });






            Android Developer is a new contributor. Be nice, and check out our Code of Conduct.










             

            draft saved


            draft discarded


















            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53403375%2fprevent-multiple-calls-to-the-method-using-rxjava%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown

























            1 Answer
            1






            active

            oldest

            votes








            1 Answer
            1






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes








            up vote
            1
            down vote













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





            share|improve this answer

























              up vote
              1
              down vote













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





              share|improve this answer























                up vote
                1
                down vote










                up vote
                1
                down vote









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





                share|improve this answer












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






                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Nov 21 at 1:15









                Dave Moten

                10k12735




                10k12735






















                    Android Developer is a new contributor. Be nice, and check out our Code of Conduct.










                     

                    draft saved


                    draft discarded


















                    Android Developer is a new contributor. Be nice, and check out our Code of Conduct.













                    Android Developer is a new contributor. Be nice, and check out our Code of Conduct.












                    Android Developer is a new contributor. Be nice, and check out our Code of Conduct.















                     


                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function () {
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53403375%2fprevent-multiple-calls-to-the-method-using-rxjava%23new-answer', 'question_page');
                    }
                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    Popular posts from this blog

                    Berounka

                    Sphinx de Gizeh

                    Different font size/position of beamer's navigation symbols template's content depending on regular/plain...