EventBus是一个非常有名的Android开源项目,能非常方便地对应用内消息进行分发和处理,因近期在看消息通道相关的东西,就看了下代码学习一下,项目地址:EventBus
gradle项目中加入dependencies即可使用:
dependencies {
compile 'org.greenrobot:eventbus:3.1.1'
}
在需要注册的地方使用register
方法注册,并给需要接受和处理消息的方法加上Subscribe
注解
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EventBus.getDefault().register(this);
// 在post方法执行后,onMessageEvent将会收到消息,并且打出对应的Log
EventBus.getDefault().post(new MessageEvent());
}
public interface IMessageEvent{
void print();
}
public abstract static class AbstractMessageEvent {
}
public static class MessageEvent extends AbstractMessageEvent implements IMessageEvent{
@Override
public void print() {
Log.d("onMessageEvent","Received.");
}
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event) {
event.print();
}
}
EventBus主要使用了观察者模式进行系统的设计。在EventBus中,我们把观察者对象称为订阅者Subscriber
,前面的例子中,MainActivity就是一个Subscriber
onMessageEvent则是一个SubscribeMethod
查看EventBus的源码,在EventBus.class中有几个比较重要的变量
eventTypesChahe : 存储Event.class相关的类,包括Event类的父类、以及其实现的接口类
subscriptionsByEventType : 消息-该消息的订阅 的Map,根据发送的消息类型,可以获取到所有的Subscription(一个Subscription由一个Subscriber和一个SubscribeMethod组成) 。
typesBySubscriber:消息-订阅该消息的订阅者类型列表Class(订阅者的对象类型)的Map,根据指定的消息类型,可以找到所有的订阅者类型
重点方法在register跟subscribe中,主要流程:
EventBust.getDefault().register(Subscriber)
r
在subscriptionsByEventType中找到Subscription并取出Subscriber和SubscribMethod,根据设置线程模式的不同,使用不同的Poster,在对应的线程中对订阅方法进行反射调用,实现消息接收和处理
EventBus通过对订阅者和发布者的解耦,简化了消息发送和注册的流程,且消息主体可以为任意类的对象,使得消息虽然在EventBus中进行统一的分发和管理,但并不需要在同一地方集中注册和索引。
EventBus的代码量不多,算是一个比较轻量的框架,暂不支持跨进程的消息传递,且由于EventBus中维护的Subscriber引用都是强引用,没有及时unregister的话,可能会导致内存泄漏。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。