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);的后面,以确保在消息回调之前就注册监听成功。