版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33718648/article/details/79856053
一、EventBus的作用
EventBus可以实现各个组件之间、以及各组件与后台线程间的消息传递,用来处理一些随数据变化及时更新的界面十分方便,而且使用了EventBus后我们不用再获得对方的引用即可向对方传递数据。
二、EventBus的使用
这里表明下:以下我所写的“消息”,大多数人都说成“事件”,但是个人认为说成消息更加方便理解,因此以下大都说成消息了,纯属个人喜好。
首先需要在项目中集成EventBus的依赖包。可以采用两种方式来实现,gradle实现和直接下载对应的jar包添加到libs文件夹中。
完成EventBus的集成后,用EventBus实现消息传递的例子:
场景是,我们有消息发布类Publisher,消息订阅类Subscriber1,Subscriber2。现在需要从发布类类中发送一条消息,使得两个订阅者都能收到这条消息并执行相应的操作。
//消息类,可以理解为这个就是发布的消息,需要传递的数据也可以保存在这个对象中,此对象也可以是区别事件的标识
publish Class Message1{
//就不写get和set方法了
public String content;
}
//消息发布类
publish Class Publisher{
public static void post(Message1 message){
EventBus.getDefault().post(message);
}
}
//消息订阅类
publish Class Subscriber1{
public Subscriber1( ){
//在构造方法中订阅消息
EventBus.getDefault().register(this);
}
//添加注解,用于框架识别是否是消息处理方法,如果是的话会进一步去判断参数类型,根据参数类型决定调用哪个消息处理方法。
@Subscribe(threadMode = ThreadMode.MAIN) //在ui线程执行
public void onMyEvent(Message1 message){
System.out.println("Subscriber1 接收到消息1");
}
}
publish Class Subscriber2{
public Subscriber2( ){
EventBus.getDefault().register(this);
}
@Subscribe(threadMode = ThreadMode.MAIN) //在ui线程执行
public void onMyEvent(Message1 message){
System.out.println("Subscriber2 接收到消息1");
}
}
以上代码执行Publisher.post(new Message1 ())的输出结果如下:
Subscriber1 接收到消息1
Subscriber2 接收到消息1
如果新增一个 消息类Message2,Message1和Message2分别通知两个消息订阅类,做出如下改动:
新增消息类Message2,
publish Class Message2{
public String content;
}
修改
Subscriber2的事件处理方法,
publish Class Subscriber2{
public Subscriber2( ){
EventBus.getDefault().register(this);
}
@Subscribe(threadMode = ThreadMode.MAIN) //在ui线程执行
public void onMyEvent(Message2 message){
System.out.println("Subscriber2 接收到消息2");
}
}
然后分别在调用Publisher.post(new Message1())和Publisher.post(new Message2()),输出结果如下:
Subscriber1 接收到消息1
Subscriber2 接收到消息2
接下来修改
Subscriber1的代码如下,
publish Class Subscriber1{
public Subscriber1( ){
//在构造方法中订阅消息
EventBus.getDefault().register(this);
}
//添加注解,用于框架识别是否是消息处理方法,如果是的话会进一步去判断参数类型,根据参数类型决定调用哪个消息处理方法。
@Subscribe(threadMode = ThreadMode.MAIN) //在ui线程执行
public void onMyEvent1(Message1 message){
System.out.println("Subscriber1 接收到消息1");
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMyEvent2(Message2 message){
System.out.println("Subscriber1 接收到消息2");
}
}
然后分别在调用Publisher.post(new Message1())和Publisher.post(new Message2()),输出结果如下:
Subscriber1 接收到消息1
Subscriber1 接收到消息2
Subscriber2 接收到消息2
三、
EventBus的缺点和优化
优点:简化组件之间的通信方式,实现解耦让业务代码更加简洁。
缺点:目前发现唯一的缺点就是每个消息都必须自定义一个消息类和一个消息处理方法,造成代码维护难度提高。
这里提供一种一定程度上解决以上问题的方法:
定义一个GeneralMessage消息类。代码如下,
public Class GeneralMessage{
HashMap<String,Object> hashmap=new HashMap<String,Object>();//用来保存要传递的数据
private String name;
public GeneralMessage(String name){//用来标识不同的消息类型
this.name=name;
}
}
修改消息发布类
//消息发布类
publish Class Publisher{
public static void post(){
GeneralMessage message1=new GeneralMessage("message1");
message1.hashMap=new HashMap<>();
message1.hashMap.put("name","消息1");
GeneralMessage message2=new GeneralMessage("message2");
message2.hashMap=new HashMap<>();
message2.hashMap.put("name","消息2");
EventBus.getDefault().post(message1);
EventBus.getDefault().post(message2);
}
}
消息订阅类代码如下:
public class Subscriber1 {
public Subscriber1( ){
//在构造方法中订阅消息
EventBus.getDefault().register(this);
}
//添加注解,用于框架识别是否是消息处理方法,如果是的话会进一步去判断参数类型,根据参数类型决定调用哪个消息处理方法。
@Subscribe(threadMode = ThreadMode.MAIN) //在ui线程执行
public void onMyEvent1(GeneralMessage event){
String param=event.hashMap.get("name").toString();
if(param.equals("message1"));{
System.out.println("Subscriber1 接收到消息1--"+param);
}else{
System.out.println("Subscriber1 接收到消息2--"+param);
}
}
}
调用方法Publisher.post(),输出结果如下:
Subscriber1 接收到消息1--消息1
Subscriber1 接收到消息2--消息2
这样可以在同一个方法中接收各种消息,同时也可以用一个消息类来传递各种不同的消息。
以上内容如有错误,欢迎指正。