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();
 }
发布了98 篇原创文章 · 获赞 6 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/dirksmaller/article/details/104003927