今天写一个蓝牙通信的app,需要10ms间隔持续的接收数据,接收端当然在service里了,但是数据要在主activity进行处理和UI显示,所以我在service的蓝牙通信子线程把数据发送到activity。然后在这之前我就用了EventBus来进行service和activity的通信,但是也只是初学者想要尝试一些新东西。接下来诡异的事情发生了,因为EventBus确实不如Broadcast易用,所以我莫名其妙的替换成了Broadcast,然后activity接收有了延迟,而且是很明显的延迟,10几秒的那种。排查了好久,终于在同事指导下发现是Broadcast导致的延迟。本人菜鸟一只,也不懂为什么,只知道大概是Broadcast的性能问题,而且换了EventBus之后确实延迟现象没有了,本篇就当记录一下这个坑吧。
下面是EventBus的使用方法:
官方GitHub地址:https://github.com/greenrobot/EventBus
第一步首先添加库依赖:implementation 'org.greenrobot:eventbus:3.1.1'
第二步然后是发消息,非常简单,就一句话:EventBus.getDefault().post(new MessageEvent());
MessageEvent()自己写一个就可以,下面给一段示例:
private class MessageEvent{
public int type;
public int[] msg;
public MessageEvent(int type,int[] msg){
this.type = type;
this.msg = msg;
}
public int getType(){
return type;
}
public int[] getMsg(){
return msg;
}
}
第三步接收消息需要先注册:EventBus.getDefault().register(this); 也别忘了解注册:EventBus.getDefault().unregister(this); 在哪里接收就在那里注册,可以注册多个接收者。
注册了之后必须接收消息,不然程序会崩溃;
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event) {
switch (event.type){
case 0:
int[] msg1 = event.msg;
//do something
break;
case 1:
int[] msg2 = event.msg;
//do something
break;
}
};
threadMode是接收消息的线程模式,有四种模式可供选择:
摘抄一个别人博客的线程模式解释:
在使用EventBus的时候确实感觉易用性不够,坑很多,但是鉴于本人是初学菜鸟,可能是我不会用而已吧。