Prevent multiple calls to the method using rxjava












0















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



























    0















    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

























      0












      0








      0








      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














      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













      share|improve this question











      share|improve this question




      share|improve this question










      asked Nov 20 '18 at 23:55









      Android DeveloperAndroid Developer

      1




      1
























          1 Answer
          1






          active

          oldest

          votes


















          1














          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',
            autoActivateHeartbeat: false,
            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
            });


            }
            });














            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









            1














            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




























              1














              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


























                1












                1








                1







                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 '18 at 1:15









                Dave MotenDave Moten

                10.1k12836




                10.1k12836






























                    draft saved

                    draft discarded




















































                    Thanks for contributing an answer to Stack Overflow!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    To learn more, see our tips on writing great answers.




                    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

                    MongoDB - Not Authorized To Execute Command

                    How to fix TextFormField cause rebuild widget in Flutter

                    Npm cannot find a required file even through it is in the searched directory