View pager with multiple fragments - Eventbus get registered multiple times

976 Views Asked by At

I used ViewPager with 3 nested Fragment.I used EventBus for event handling. But in my case subscribe method gets called by multiple times. Because EventBus gets register by multiple times. I have used these methods for registeringa nd unregistering EventBus

     @Override
    public void onStop() {
        if (eventBus != null) {
            eventBus.unregister(this);
        }
        super.onStop();
    }

    @Override
    public void onPause() {
        if (eventBus != null) {
            eventBus.unregister(this);
         }
        super.onPause();
     }

    @Override
     public void onResume() {
        if (eventBus != null) {
            eventBus.register(this);
        }
        super.onResume();
    }

My viewpager is available in navigation drawer fragment. I was updated my onresume() like this but still same thing happens

 @Override
 public void onResume() {
     if (eventBus != null) {
          if (!eventBus.isRegistered(this)) {
             eventBus.register(this);
          }else{
             eventBus.unregister(this);
             eventBus.register(this);
         }
      }
      super.onResume();

}

These event received by multiple times thats why nested api gets called multiple times

@Subscribe
public void onEvent(Event event) {
    Responce Responce = event.responce;
    if (regResponce != null && regResponce.getStatus() == 0) {
         if (!isGenerateReportCalled) {
            isGenerateReportCalled = true;
            accountManager.generateReport(parameter); // server api call get called multiple times
        }
    } else {
        // error message
    }
}
3

There are 3 best solutions below

1
On

This is because you are registering event bus twice.

If event bus is not registered that time only you have to register event bus.

             @Override
             public void onResume() {
                if (eventBus != null) {
                        if (!eventBus.isRegistered(this)) {
                        eventBus.register(this);
                    }
                 }
                super.onResume();
            }
0
On

You should try to register EventBus when fragment become visible to user. In ViewPager two fragments are prepared for display, one which is visible and next which will be replaced with first one that's why you get called onResume multiple times.

Check visibility and isResumed for fragment for registering EventBus.

Visibility state may be checked here:

public class SomeFrag extends Fragment {
    @Override
    public void setMenuVisibility(final boolean visible) {
        super.setMenuVisibility(visible);
        if (visible) {
        // Register EventBus
        }
     }
}
4
On

check is EventBus registered before or not

here you can check using method isRegistered()

if(!eventBus.isRegistered(this))
        eventBus.register(this);

Remove else part from onResume().

@Override
public void onResume() {
 if (eventBus != null) {
      if (!eventBus.isRegistered(this)) {
         eventBus.register(this);
      }
  }
  super.onResume();
}