欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

EventBus一之基本使用

程序员文章站 2022-06-09 23:45:48
...

常见事件传递方式

EventBus一之基本使用

EventBus是什么

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

EventBus使用场景

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

官方架构图

EventBus一之基本使用

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();
 }