事件总线模式知识总结

经过对多个有关事件总线模式的文档介绍的阅读,对事件总线模式有了一定的了解,并作出如下总结:
事件总线模式主要是处理事件,包括4个主要组件:事件源、事件监听器、通道和事件总线。消息源将消息发布到事件总线上的特定通道上。侦听器订阅特定的通道。侦听器会被通知消息,这些消息被发布到它们之前订阅的一个通道上。
使用场景:安卓开发、通知服务
优点:新的发布者、订阅者和连接可以很容易地添加。对高度分布式的应用程序有效。
缺点:可伸缩性可能是一个问题,因为所有消息都是通过同一事件总线进行的。
事件总线的处理流程:
实例:事件总线模式是一种广泛运用于安卓开发之中的一种软件架构模式,而事件总线模式在安卓开发中最广泛的应用莫过于androidstudio提供的eventbus,所以我就eventbus来谈谈对事件总线模式的认识。
eventbus是android下高效的发布/订阅事件总线机制。作用是可以代替传统的intent,handler,broadcast或接口函数在fragment,activity,service,线程之间传递数据,执行方法。特点是代码简洁,是一种发布订阅设计模式(publish/subsribe),或称作观察者设计模式。我们可能对事物总线机制还是有点陌生,但是想必对23种软件设计模式之后的观察者模式应该很熟悉。事物总线模式就是观察者设计模式的一种,它的工作部件主要分为四种:事件源、事件监听器、通道和事件总线。它的主要工作原理:事件源将产生的消息发送到事件总线的特定通道之上,然后监听器在事先会订阅事务总线之中不同的通道以区分消息的响应,然后当消息被发送到事务总线的特定通道之中时,所对应的监听器会监听到消息,然后监听器根据程序中设置的响应函数进行执行。就好像一个activity之中设置的button一样,在xml文件中放入一个button,然后在java类中设定onevent()函数,当button被点击的时候,则会传出一个点击消息,然后按钮对应的onclick()函数,监听到点击消息,从而执行onlisterner()之中的函数。
那么下面我们结合具体的实例来分析事件总线模式,提到这个模式我们第一个想到的一定是adroid开发之中的一个组件——event bus。event bus是android studio官方为我们提供的一个工具包。下面我们就根据一个具体的框架来对event bus进行讲解。
我们想要实现的一个效果是,有两个acivity如图mainactivity:当点击click按钮的时候,就会跳转到secondactivity,而secondactivity里面有两个按钮,点击以后,可以改变mainactivity里面textview的文字。
要实现这样的效果无非是完成一个消息的传递,相当于我们的观察者模式中发布者发布的一个消息,然后订阅者通过特定的通道进行监听,最后实现消息的传递。
首先是mainactivity:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 publicclassmainactivityextendsfragmentactivity {
button btn;
textview text;
@override
protectedvoidoncreate(bundle savedinstancestate) {
super.oncreate(savedinstancestate);
setcontentview(r.layout.activity_main);
eventbus.getinstance().register(this);
btn = (button) findviewbyid(r.id.btn);
text = (textview) findviewbyid(r.id.text);
btn.setonclicklistener(newview.onclicklistener() {
@override
publicvoidonclick(view v) {
startactivity(newintent(mainactivity.this,secondactivity.class));
}
});
}
publicvoidonevent(info i){
log.i(cky, i.msg);
}
publicvoidoneventmain(info i){
text.settext(i.msg);
}
publicvoidoneventmain(info2 i){
text.settext(text.gettext()+i.msg);
}
}
从上面我们可以看出mainactivity的创建函数oncreate函数中调用了eventbus的register(this)函数,用来注册。然后是onevent(),这个方法里面的代码,会在一个子线程中执行一个是oneventmain(),这个方法里面的代码,会在ui线程执行。
然后是secondactivity
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 publicclasssecondactivityextendsactivity {
button btn2;
button btn3;
@override
protectedvoidoncreate(bundle savedinstancestate) {
super.oncreate(savedinstancestate);
setcontentview(r.layout.activity_second);
btn2 = (button) findviewbyid(r.id.btn2);
btn2.setonclicklistener(newview.onclicklistener() {
@override
publicvoidonclick(view v) {
eventbus.getinstance().post(newinfo(信息1));
}
});
btn3 = (button) findviewbyid(r.id.btn3);
btn3.setonclicklistener(newview.onclicklistener() {
@override
publicvoidonclick(view v) {
eventbus.getinstance().post(newinfo2(信息2));
}
});
}
}
那么这些活动之中的“始作俑者”——eventbus类又是什么样的呢?
1
2
3
4
5
6
7
8
9
10
11
12 publicclasseventbus {
hashmap subscriptionsbyeventtype =
newhashmap();
mainthreadhandler mainthreadhandler =newmainthreadhandler(this,looper.getmainlooper());
asythreadhandler asythreadhandler =newasythreadhandler(this);
privatefinalstaticeventbus instance =neweventbus();
publicstaticeventbus getinstance(){
returninstance;
}
privateeventbus(){};
}
在这其中:
register方法之中我们先获取了订阅者(例子中是mainactivity)的方法,找到onevent开头的方法,获得它们的参数类型。然后判断subscriptionsbyeventtype是否有以这些参数类型为key的数据,如果没有,新建一个arraylist。
subscription它代表一个订阅,拥有subsriber,也就是订阅者还有一个subscribermethod,这是订阅方法类。
post()方法里面,如同我们上面所说,获取了参数类型,然后在subscriptionsbyeventtype中查询所有改类型对应的订阅subscription对于subscription,它有我们订阅类的所有信息。首先根据type判断是在主线程还是子线程执行,然后调用一开始讲到的两个类的实例就好了。
invoke()其实只有一句话,就是调用了反射去执行方法。m是订阅方法,sub.subscriber就是订阅者,event就是post()方法传入的实体这样我们就在子线程中调用了这个方法了,相当于mainactivity主动调用这个方法。
因为这个模式的使用较少所以网上可以找到的只有这一种实例,其实事件总线这个概念对你来说可能很陌生,但提到观察者(发布-订阅)模式,你也许就很熟悉。事件总线是对发布-订阅模式的一种实现。它是一种集中式事件处理机制,允许不同的组件之间进行彼此通信而又不需要相互依赖,达到一种解耦的目的。

DIN44-A4-P1-A3 4-20mA转0-20mA分配器变送器四进四出
【冷剪机维修】冷剪机轴承位磨损的现场修复技术
米尔联合NXP专场优惠活动,双重惊喜等你撩~
压接电线“包皮”过长而发生故障
Galaxy Tab A7(2020)预算友好型平板电脑在欧洲正式上市
事件总线模式知识总结
采用互补管的电灯开关电路图
好房易购与中国联通合作,共创智慧社区
TDK风力发电机真机演示将登陆高交会电子展
静电损害磁致伸缩这些让器件失效的原因终于看懂了
油田人员定位及轨迹管理的重要性
PCB线路板的各种基板材简介
6KD6五极管OTL功放电路图
苹果新款手机订单减少,而旧款手机订单取在增加
电压调节器的物理特性对于EMI和EMC的兼容性至关重要
浅谈精密露点仪与锂电池生产的关系
音圈马达无人机静宁苹果代言
“量子安全通话”的手机究竟为何物?与传统手机有何区别?
目前导热工程材料已经越来越受到市场的欢迎
你听说过人手支付吗