3

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
    }
}
Kishore Jethava
  • 6,666
  • 5
  • 35
  • 51
Priya Sasane
  • 103
  • 1
  • 1
  • 6

3 Answers3

0

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
        }
     }
}
kenzo
  • 211
  • 1
  • 9
0

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();
}
Kishore Jethava
  • 6,666
  • 5
  • 35
  • 51
  • plz check onevent method....i am new to stackoverflow....so formatting not done properly....thnks – Priya Sasane Feb 17 '17 at 07:02
  • my viewpager is from navigation drawer fragment....if i navigate to other fragment other than navigation drawer then these error happens – Priya Sasane Feb 17 '17 at 07:10
  • register event only in those fargment where you calling `event.post()`, not where `onEvent()` method is. are you doing this? – Kishore Jethava Feb 17 '17 at 07:14
  • actuly i used one AccountManager class where i used volleys onResponce() in which post event like public void onResponse(Responce response) { EventBus.getDefault().post(new Event(response)); } – Priya Sasane Feb 17 '17 at 07:23
0

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();
            }
Rahul Devanavar
  • 3,917
  • 4
  • 32
  • 61