3

我使用ViewPager了 3 个嵌套的Fragment.I 用于EventBus事件处理。但在我的情况下,订阅方法被多次调用。因为EventBus被多次注册。我已经使用这些方法进行registering注销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()像这样更新了我,但仍然发生同样的事情

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

}

这些事件被多次接收,这就是为什么嵌套 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
    }
}
4

3 回答 3

0

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

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

             @Override
             public void onResume() {
                if (eventBus != null) {
                        if (!eventBus.isRegistered(this)) {
                        eventBus.register(this);
                    }
                 }
                super.onResume();
            }
于 2017-02-17T06:41:42.830 回答
0

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

检查用于注册 EventBus 的片段的可见性和 isResumed。

可以在此处检查可见性状态:

public class SomeFrag extends Fragment {
    @Override
    public void setMenuVisibility(final boolean visible) {
        super.setMenuVisibility(visible);
        if (visible) {
        // Register EventBus
        }
     }
}
于 2017-02-16T13:30:46.940 回答
0

支票是否EventBus注册过

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

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

从 中删除 else 部分onResume()

@Override
public void onResume() {
 if (eventBus != null) {
      if (!eventBus.isRegistered(this)) {
         eventBus.register(this);
      }
  }
  super.onResume();
}
于 2017-02-16T13:37:24.040 回答