2017-02-16 68 views
3

我使用ViewPager与3个嵌套Fragment。我使用EventBus进行事件处理。 但在我的情况下,订阅方法被多次调用。因为EventBus获得多次注册。 我已经使用了这些方法registering一个第二注销EventBus查看具有多个片段的寻呼机 - 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(); 
    } 

viewpagernavigation drawer fragment可用。 我更新了我的onresume()喜欢这一点,但仍然同样的事情发生

​​3210

}

通过多次收到这些事件这就是为什么嵌套API获取调用多次

@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 
    } 
} 

回答

0

你应该尝试当片段变得对用户可见时,注册EventBus。在ViewPager中,准备显示两个片段,一个是可见的,另一个将被第一个替换,这就是为什么您多次调用onResume的原因。

检查可见性并为注册事件总线的片段进行恢复。

可见性状态可以在这里检查:

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

检查EventBus之前注册与否

在这里你可以查看使用方法isRegistered()

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

删除其他部分来自onResume()

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

PLZ检查我更新的onResume方法....仍然多次收到的onEvent的' –

+0

邮编事件()' –

+0

PLZ检查的OnEvent方法....我是新来的StackOverflow ....所以格式化不正确.... thnks –

0

这是因为您正在注册两次事件总线。

如果事件总线没有注册,那么只有你必须注册事件总线。

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

我已更新我的onResume()plz chk一次 –

+0

您做错了其他事情再次注册事件总线 –