美文网首页
EventBus3.0的正确使用

EventBus3.0的正确使用

作者: 35瓦大灯泡 | 来源:发表于2020-05-14 15:18 被阅读0次

github地址:https://github.com/greenrobot/EventBus

EventBus3.x的使用方法基本与EventBus2.x的相同,但是3.x可以使用注解处理器,由于2.x使用的是运行时注解,很大基础上依赖Java的反射机制,效率不高。

反射机制对整个注册的类的所有方法进行扫描,所以消耗性能,而开启系统索引的3.x效率比2.x快很多

EventBus注解处理器文档:https://greenrobot.org/eventbus/documentation/subscriber-index/

EventBus相信大家已经非常熟悉,但是官方介绍还是有不正确的地方,我们看一下github上的介绍级使用

首先引入依赖
implementation 'org.greenrobot:eventbus:3.2.0'
step 1 创建一个事件
public static class MessageEvent { /* Additional fields if needed */ }
step 2 注册、反注册、订阅
// 注册
 @Override
 public void onStart() {
     super.onStart();
     EventBus.getDefault().register(this);
 }

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

// 订阅事件
@Subscribe(threadMode = ThreadMode.MAIN)  
public void onMessageEvent(MessageEvent event) {/* Do something */};
step 3 发送事件
EventBus.getDefault().post(new MessageEvent());

以上是作者介绍的使用方法,这里有两个问题

  • 1.在 onStop()中反注册会导致无法接收到新页面或着其他页面发送的事件
  • 2.从EventBus源码中我们知道它的原理使用的是反射,性能较低

下面我们来解决上面提到的两个问题,看一下正确的使用方法

1.首先引入依赖

注意:增加了一个注解处理器的引用,注解处理器的版本跟随eventbus的版本

implementation 'org.greenrobot:eventbus:3.2.0'
annotationProcessor "org.greenrobot:eventbus-annotation-processor:3.2.0"
2.在build.gradle添加索引

添加eventbus的注释处理器 使用的依赖annotationProcessor 配置。通过添加eventBusIndex处理器选项生成的索引类的包和名称。

com.example.myapp替换为自己的包名
MyEventBusIndex可自定义其他名称,不同Module注册不同名称的索引

android {
    defaultConfig {
        javaCompileOptions {
            annotationProcessorOptions {
                arguments = [ eventBusIndex : 'com.example.myapp.MyEventBusIndex' ]
            }
        }
    }
}
3.在Application中初始化
// 添加注解参数
EventBus.builder().addIndex(new MyEventBusIndex()).build();
// 添加注解参数
EventBus.builder().addIndex(new MyEventBusIndex()).installDefaultEventBus();

在Application中添加以上代码会发现new MyEventBusIndex()报红,此时build一下项目即可,
如果依然报红,则需要有Activity、Fragment等订阅事件之后才会在编译后自动生成,订阅事件之后,build项目

如果其他组件或者模块也需要使用注解处理器,则

EventBus eventBus = EventBus.builder()
    .addIndex(new MyEventBusAppIndex())
    .addIndex(new MyEventBusLibIndex()).build();

MyEventBusAppIndex () MyEventBusLibIndex ()为第二步中定义的不同模块的索引

4.注册与反注册
// onCreate中注册
@Override
protected void onCreate(Bundle savedInstanceState) {
    EventBus.getDefault().register(this);
}

// onDestroy中反注册,建议先判断注册状态
@Override
protected void onDestroy() {
    if (EventBus.getDefault().isRegistered(this)) {
        EventBus.getDefault().unregister(this);
    }
}
5.发送事件及订阅事件
// 自定义事件
public static class MessageEvent { /* Additional fields if needed */ }
// 发送事件
EventBus.getDefault().post(new MessageEvent());
// 订阅事件
@Subscribe(threadMode = ThreadMode.MAIN)  
public void onMessageEvent(MessageEvent event) {/* Do something */};

EventBus3.x的正确使用到此就结束了

相关文章

  • EventBus3.0的正确使用

    github地址:https://github.com/greenrobot/EventBus EventBus3...

  • EventBus3.0 一

    EventBus3.0 使用 EventBus基本使用发送事件注册接收(main posting backgrou...

  • EventBus3.0使用(一)

    3Steps简单使用EventBus3.0 在使用EventBus 先在Gradle 添加依赖 定义Event事件...

  • EventBus3.0的使用

    相信Android的同志们都知道这个玩意,github16k的存在神器,但是这几天遇到一个问题,在一个activi...

  • EventBus3.0的使用

    使用: 网址:https://github.com/greenrobot/EventBus 依赖:compile'...

  • EventBus3.0的使用

    EventBus最新版,用法有变,网上很多都过时了,现在自己来总结。 首先订阅者必须注册和反注册,发布者不需要注册...

  • EventBus3.0使用(二)

    上一篇EventBus3.0使用(一) Sticky Events 粘性事件 Sticky Events可以允许事...

  • EventBus3.0使用

    EventBus是使用十分广泛的事件总线框架, 2.0到3.0的变化还是挺大的 今天准备重构代码,关于解耦想到了用...

  • EventBus3.0使用

    由于最近更新了EventBus3.0,里面的onEvent方法改变了,在此坐下记录,方便自己以后查阅及使用。Eve...

  • 自己实现简单的EventBus功能

    1、下面是EventBus3.0的一些用法和源码分析 EventBus使用详解 EventBus源码解析 2、接...

网友评论

      本文标题:EventBus3.0的正确使用

      本文链接:https://www.haomeiwen.com/subject/vqqtohtx.html