EventBus一之基本使用

常见事件传递方式

在这里插入图片描述

EventBus是什么

EventBus is a publish/subscribe event bus for Android and Java.

EventBus使用场景

a.简化组件间,组件与后台线程的通讯。
b.解耦消息的发送方与接收方

官方架构图

在这里插入图片描述

github地址

EventBus传送门

implementation 'org.greenrobot:eventbus:3.1.1'
使用三个步骤

1)定义一个事件

public class MessageEvent {
    public String text;
}

2)订阅事件

@Subscribe(threadMode = ThreadMode.MAIN)  
public void onMessageEvent(MessageEvent event) {/* Do something */};

 @Override
 public void onStart() {
     super.onStart();
     EventBus.getDefault().register(this);
 }

 @Override
 public void onStop() {
     super.onStop();
     EventBus.getDefault().unregister(this);
 }

3)发布事件

MessageEvent msg = new MessageEvent();
EventBus.getDefault().post(msg);
使用注解处理的EventBus

上述的使用方式,利用了反射遍历获取订阅方法的实现,正确使用EventBus,可以使用注解处理,避免反射遍历。
1)配置gradle 支持注解处理器

android {
    defaultConfig {
        javaCompileOptions {
            annotationProcessorOptions {
                arguments = [ eventBusIndex : 'com.example.myapp.MyEventBusIndex' ]
            }
        }
    }
}
 
dependencies {
    implementation 'org.greenrobot:eventbus:3.1.1'
    annotationProcessor 'org.greenrobot:eventbus-annotation-processor:3.1.1'
}

2)订阅事件并且build project

@Subscribe(threadMode = ThreadMode.MAIN)  
public void onMessageEvent(MessageEvent event) {/* Do something */};

 @Override
 public void onStart() {
     super.onStart();
     EventBus.getDefault().register(this);
 }

 @Override
 public void onStop() {
     super.onStop();
     EventBus.getDefault().unregister(this);
 }

注解处理器会自动生成SubscriberInfoIndex类


/** This class is generated by EventBus, do not edit. */
public class MyEventBusIndex implements SubscriberInfoIndex {
    private static final Map<Class<?>, SubscriberInfo> SUBSCRIBER_INDEX;

    static {
        SUBSCRIBER_INDEX = new HashMap<Class<?>, SubscriberInfo>();

        putIndex(new SimpleSubscriberInfo(MainActivity.class, true, new SubscriberMethodInfo[] {
            new SubscriberMethodInfo("handleMessageEvent", com.canjun.eventbus1.msg.MessageEvent.class,
                    ThreadMode.MAIN),
        }));

    }

    private static void putIndex(SubscriberInfo info) {
        SUBSCRIBER_INDEX.put(info.getSubscriberClass(), info);
    }

    @Override
    public SubscriberInfo getSubscriberInfo(Class<?> subscriberClass) {
        SubscriberInfo info = SUBSCRIBER_INDEX.get(subscriberClass);
        if (info != null) {
            return info;
        } else {
            return null;
        }
    }
}

3)使用生成类

	
EventBus eventBus = EventBus.builder().addIndex(new MyEventBusIndex()).build();
如果要使用单例,则:
EventBus.builder().addIndex(new MyEventBusIndex()).installDefaultEventBus();
EventBus eventBus = EventBus.getDefault();
事件
粘性事件

场景:
当事件的发送方发送一个类型的事件,并且期望未来订阅该类型事件的方法,也要处理当前的这个事件。此时,发送方需要发送一个粘性事件,并且要求订阅方也要声明处理函数可以接受粘性事件

 //发送方
 EventBus.getDefault().postSticky(msg);
 //接收方
 @Subscribe(threadMode = ThreadMode.MAIN,sticky = true)
 public void handleMessageEvent(MessageEvent msg){
     Toast.makeText(MainActivity.this,msg.text,0).show();
 }
事件的优先级

事件的优先级,决定了订阅方法处理的先后顺序。优先级的值越高,越优先处理。默认的值为0

@Subscribe(threadMode = ThreadMode.MAIN,priority = 1)
public void handleMessageEvent(MessageEvent msg){
     Toast.makeText(MainActivity.this,msg.text,0).show();
 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值