Android-EventBus 使用以及区别

况庆
2023-12-01

使用详解以及各版本的一些区别, 在了解版本区别之前先简单了解一下。

EventBus文档 http://greenrobot.org/eventbus/documentation

EventBus源码 https://github.com/greenrobot/EventBus

EventBus是什么?

EventBus是一种发布者和订阅者的事件分发模式。可以这么理解,比如我们订阅的Android Weekly,每当星期一0点这个时候,Android WeekLy公司,都会以邮件的形式通知我们。

目前有多个库都开发了这样的功能。它有以下的优点:

  • 方法库较小
  • 便于集成
  • 使用简单

我们为什么要使用EventBus?

EventBus是彻底解耦的观察者模式。我们常常用在对象一对多的情况,使一个对象发生改变的时候,所有依赖的对象能够得到通知并更新。 比如我们在实际的开发中,当用户登录了,我们多个页面需要根据登录后的信息更改页面UI。这时,登录界面就是发布者,而其他的页面就是订阅者。它 们都在订阅用户信息变化的消息。 再比如我们的Fragment间的通信。

EventBus 1.0.5.1:

   implementation 'org.simple:androideventbus:1.0.5.1'
复制代码

使用:

注意:官方是推荐将注册写到onStart,将注销写到onStop中,当然你也可以跟具自己的需求来改变的。

sticky 在注册期间,所有粘性订户方法将立即获得之前发布的粘性事件。
我在项目中碰到一个小问题就是我在A 界面发送一个粘性事件 在B 界面接受,如果 控件还未初始化完成,EventBus就已经注册了,那么在监听方法中的控件就未初始化,使用时也就为空。

   @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_register);
        EventBus.getDefault().register(this);
        initView();
    }
复制代码

1.注册onCreate()中:

    EventBus.getDefault().register(this);
复制代码

2.解除注册onDestroy方法:

    EventBus.getDefault().unregister(this);
复制代码

3.监听(自定义方法即可,1.0是根据@Subscriber(tag=“resultData”)):

    @Subscriber(tag = "resultData")  
    public void resultData(String data)   
    {   
      TextView.setText(data);   
    }   
复制代码

4.发布事件 :

EventBus.getDefault().post(string,“resultData”);
复制代码

 

EventBus 2.4.1:

   implementation'de.greenrobot:eventbus:2.4.1'
复制代码

使用:
1.注册onCreate()中:

    EventBus.getDefault().register(this);
复制代码

2.解除注册onDestroy方法:

    EventBus.getDefault().unregister(this);
复制代码

3.新建event类 :

    public class MainEvent {
        private String message;
    
        public MainEvent(String message) {
            this.message = message;
        }

        public String getMessage() {
            return message;
        }
    
        public void setMessage(String message) {
            this.message = message;
        }
    }
复制代码
  1. 监听:
    必须重写约定好的方法。
    EventBus 在3.0.0版本以下的接收事件方法都是在约定好的方法进行接收。EventBus提供了以下几个方法进行接收事件:
    onEvent() :执行在发送事件的线程。
    onEventMainThread 代表这个方法会在UI线程执行。
    onEventPostThread :代表这个方法会在当前发布事件的线程执行。
    onEventBackgroundThread :事件处理是在后台线程,但事件处理时间还是不应该太长, 因为如果发送事件的线程是后台线程,会直接执行事件, 如果当前线程是UI线程,事件会被加到一个队列中,由一个线程依次处理这些事件, 如果某个事件处理时间太长,会阻塞后面的事件的派发或处理。
    onEventAsync :每个事件会开启一个线程(有线程池),但最好限制线程的数目 。
      public void onEvent(MainEvent event) {
            if (TextUtils.isEmpty(event.getName()))
                return;
            Toast.makeText(this, event.getName(), Toast.LENGTH_SHORT).show();
        }
复制代码
  1. 发布事件:
  EventBus.getDefault().post(new MainEvent("Hello everyone"));
复制代码

   

EventBus 3.1.1:

implementation 'org.greenrobot:eventbus:3.1.1'
复制代码

使用:

  1. 注册onCreate()中:
    EventBus.getDefault().register(this);
复制代码
  1. 解除注册onDestroy方法:
    EventBus.getDefault().unregister(this);
复制代码
  1. 新建event类 :

  2. 监听:

    threadMode指线程模式, priority指事件的优先级, sticky是否为粘性事件

    threadMode 就是旧版本接收信息运行的方法:

    1. NAIN UI主线程
    2. BACKGROUND 后台线程
    3. POSTING 和发布者处在同一个线程(默认)
    4. ASYNC 异步线程

    priority 其实和Boardcast接收者的优先级差不多,数越大优先级越高,一般0-100。默认为0

    sticky 在注册期间,所有粘性订户方法将立即获得之前发布的粘性事件

    @Subscribe
    public void getEventBus(RegisterEvent event){
      (...)
    }

    @Subscribe(threadMode = ThreadMode.POSTING, priority = 2, sticky = true)    
    public void getEventBus(RegisterEvent event){
      (...)
    }
复制代码
  1. 发布事件:
     //发布普通事件
     EventBus.getDefault().post(new RegisterEvent());
     //发布粘性事件
     EventBus.getDefault().postSticky(new RegisterEvent());
复制代码
  1. 移除粘性事件:
     //移除粘性事件
     EventBus.getDefault().removeStickyEvent(new RegisterEvent());
     //移除所有粘性事件
     EventBus.getDefault().removeAllStickyEvents();
复制代码

 

EventBus优缺点:

优点:插件大小合适,仅54K ,
简化组件之间的通信方式,实现解耦让业务代码更加简洁,可以动态设置事件处理线程以及优先级

缺点:每个事件都必须自定义一个事件类,造成事件类太多,无形中加大了维护成本

EventBus 3.1.1与2.4.1的区别 :

代码更加简洁: EventBus 2.4.1 必须定义以onEvent开头的几个方法,代码中语境比较突兀,且有可能会导致拼写错误
EventBus 3.1.1 函数名字不再受到权限,而且可以在一个函数中体现出在哪个线程执行,并且可指定接收事件的优先级。

性能 :
EventBus 2采用反射的方式对整个注册的类的所有方法进行扫描来完成注册,会有性能上的影响。

EventBus 3中EventBus提供了EventBusAnnotationProcessor注解处理器来在编译期通过读取@Subscribe()注解并解析、处理其中所包含的信息,然后生成java类来保存所有订阅者关于订阅的信息,这样就比在运行时使用反射来获得这些订阅者的信息速度要快。

 

如有不对的地方欢迎大家指正交流。

转载于:https://juejin.im/post/5cadb2536fb9a0687d1167ae

 类似资料: