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();
- }
- }
粘性信息的接收函数仅比普通消息多一个参数。
posting:发布事件与接收事件在一个线程中,应尽量避免耗时操作,否则容易阻塞事件传递。
main:事件的处理在主线程中进行。
background:如果事件从主线程中发布,则在子线程中处理事件;如果事件从子线程发布,则在该子线程中处理。
async:无论事件从哪个线程发布,都要创建一个新线程处理事件。