eventbus是安卓开发中常用的消息传递工具,能够有效对发送方与接收方解耦合。
配置eventbus
在build.gradle中,在依赖中添加:
implementation 'org.greenrobot:eventbus:3.1.1'
普通消息实现
普通消息的特点是,消息发送时若无接收方进行接受,则此消息作废。
消息类型
消息类型通常由自定义的类实现:
public class Message {
private String name;
private int age;
public Message(String name,int age){
this.name = name;
this.age = age;
}
public String getName(){
return this.name;
}
public int getAge(){
return this.age;
}
public void setName(String name){
this.name = name;
}
public void setAge(int age){
this.age = age;
}
}
该消息类型中包含两个数据,一个是名字,一个是年龄。
消息发送
EventBus.getDefault().post(new Message("kuaile",22));
EventBus.getDefault()获得eventbus的一个实例,该类是一个单例模式。
我们实现一个信息对象,并为其成员变量赋值,该对象就是我们要传递的信息。
信息接受
信息接收方需要进行注册信息接受,并且在退出后解除注册。
//注册eventbus
EventBus.getDefault().register(this);
// 解除注册eventbus
@Override
protected void onDestroy(){
super.onDestroy();
if (EventBus.getDefault().isRegistered(this)){
EventBus.getDefault().unregister(this);
}
}
注册内容实现后需要实现信息的接收:
@Subscribe(threadMode = ThreadMode.POSTING)
public void onEvent(Message message){
if(message != null){
Toast.makeText(this,"name "+message.getName()+" age "+message.getAge(),Toast.LENGTH_SHORT).show();
}
}
在接收函数中要实例化一个消息类型的对象,并同时读取消息。
粘性消息实现
粘性消息的特点是,即便消息已经发送出去,也就是经过了发信息的时间点,之后注册的接收方照样可以接受到此信息。
信息发送
EventBus.getDefault().postSticky(new Message("huankuai",21));
信息注册
信息注册的内容与普通信息完全一样。
信息接收
@Subscribe(threadMode = ThreadMode.POSTING,sticky = true)
public void onEvent(Message message){
if(message != null){
Toast.makeText(this,"name "+message.getName()+" age "+message.getAge(),Toast.LENGTH_SHORT).show();
}
}
粘性信息的接收函数仅比普通消息多一个参数。
ThreadMode
posting:发布事件与接收事件在一个线程中,应尽量避免耗时操作,否则容易阻塞事件传递。
main:事件的处理在主线程中进行。
background:如果事件从主线程中发布,则在子线程中处理事件;如果事件从子线程发布,则在该子线程中处理。
async:无论事件从哪个线程发布,都要创建一个新线程处理事件。