EventBus使用中遇到接收不到消息的坑(注册EventBus的监听要先于Event Bus 消息的发送)

    昨天在使用EventBus的时候遇到了一个坑,在代码写完以后检查了N遍,并没有发现有什么不妥的地方,该注册监听的Activity中都有对该时间进行监听注册。

   代码是这样的:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity);

    //查询该设备绑定状态,一个耗时操作,在fetchAuthBindState方法中调用EventBus发送消息
(1)    fetchAuthBindState();

    //EventBus 监听
(2)    EventBus.getDefault().register(this);

}
public void fetchAuthBindState() {

           *******************

            *****************

    notifyDataSetChanged(authBindStateParam,status);

}

private void notifyDataSetChanged() {

        BindStateEvent event = new BindStateEvent();

         event.setAuthBindStateParam(authBindStateParam);

(3)EventBus.getDefault().post(event);

}

 

    如代码所示,我在给EventBus注册监听之前,进行了一个耗时操作,去请求查询状态。通过(3)发送到注册了监听的Activity。

 

    后面发现问题就在这里!!!

我在fetchAuthBindState()方法中开启了一个子线程进行耗时操作,所以在第(1)步执行的同时,第(2)也会同时进行。但是如果第(1)步的的获取速度很快,那么当第(3)步发送消息的时候,Activity可能还没有注册好,此时Activity将接受不到消息,导致activity并没有做出相应的操作。(也有可能出现有时接收的到消息而有时又接收不到消息的情况)

 

    正确的做法应该是把EventBus的注册写在耗时操作之前,以保证EventBus的消息能够正常接收的到。

   如下:

@Override protected void onCreate(Bundle savedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.activity);

//EventBus 监听

(2) EventBus.getDefault().register(this);

//查询该设备绑定状态,一个耗时操作,在fetchAuthBindState方法中调用EventBus发送消息

(1) fetchAuthBindState();
 

}

 

      结语:

我建议以后关于一些监听的注册,最好直接写在

super.onCreate(savedInstanceState);的后面,以确保在消息回调之前就注册监听成功。