EventBus的简单用法及介绍

今天在工作中遇到一个小难题 组件之间的事件传递,我的老大(凌哥)告诉我可以使用EventBus解决
之前只是听说过 但是没有具体使用过,然后上论坛看一下别人的分享,自己也敲了一个简单的Demo
仅供初学者参考,大神可以略过!

EventBus简单介绍:

一个Android事件发布/订阅轻量级框架

功能:通过解耦发布者和订阅者简化Android事件传递
EventBus可以代替Android传统的Intent,Handler,Broadcast或接口函数
在Fragment,Activity,Service线程之间传递数据,执行方法。

特点:代码简洁,是一种发布订阅设计模式(观察者设计模式)。

EventBus使用场景

  • 用于线程间的通讯代替handler或用于组件间的通讯代替Intent
  • 广泛用于团购,商城,社交等应用
  • 实践证明已经有一亿多的APP中集成了EventBus

EventBus优势

  • 简化了组件间的通讯。
  • 分离了事件的发送者和接受者。
  • 在Activity、Fragment和线程中表现良好。
  • 避免了复杂的和易错的依赖关系和生命周期问题。
  • 使得代码更简洁,性能更好。
  • 更快,更小(约50k的jar包)。

EventBus原理图

  • EventBus底层采用的是注解和反射的方式来获取订阅方法信息(首先是注解获取,若注解获取不到,再用反射)
  • 当前订阅者是添加到Eventbus 总的事件订阅者的subscriptionByEventType集合中
  • 订阅者所有订阅的事件类型添加到typeBySubscriber 中,方便解注册时,移除事件

提示:反射比注解更消耗资源且效率低

这里写图片描述

EventBus基本使用

(一)关联EventBus框架
选中你所要关联的Modules,点击Dependencies,在点击+号,选择library dependency
在输入框中输入eventbus,选择greenrobot公司提供的,进行关联,新建一个Activity
(二)在OnCreate注册,在OnDestroy解除注册
提示参数是上下文(注意是:你的事件在哪接收,就在哪个类进行EventBus的注册和解除操作.)

@Override    
    protected void onCreate(Bundle savedInstanceState) {

       super.onCreate(savedInstanceState);

       setContentView(R.layout.activity_main);

       //1. 注册EventBus,参数是上下文.        注意:导入的EventBus请认准org.greenrobot.

       //注意:有注册就必须有解注册(一般在OnDestroy里执行解注册操作),防止内存泄漏,注册一个界面只能注册一次,否则报错

       //关于源码我只强调一点:EventBus拿到订阅方法,无法两种手段:1注解  2:反射

       EventBus.getDefault().register(MainActivity.this);

    }

    @Override
    protected void onDestroy() {
       //这里解除注册
       EventBus .getDefault().unregister(MainActivity.this);

       super.onDestroy();

    }

(三)创建EventBus消息类,设置属性。

public class MessageEvent  {

    private String message;

    public MessageEvent(String message) {
        this.message = message;
    }

    public String getMessage() {
        return message;
    }
}

(四)使用EventBus的Post方法发送事件

 //4. 使用EventBus发送事件,使用Post方法,参数也必须是EventBus消息对且要和接收的保持一致    

    EventBus.getDefault().post(new EventBusMessage("这是来自第二个Activity发出的消息"));

(五)根据消息类,接收事件
接收消息,参数就是你定义的EventBus消息类,和发送消息类必须是同一个

加注解提示:在写接收消息的方法是,方法名可以自定义,权限必须是public,
参数必须是一个只要接收的参数类型是一致的,那么四个方法都可以接收到发送的信息 注释:给人看注解:给机器看
ThreadMode.MAIN表示这个方法在主线程中执行(适合做异步加载,可以将子线程加载到数据直接设置到UI界面里)    

    @Subscribe(threadMode = ThreadMode.MAIN)

    public void MessageEventBus(EventBusMessage eventBusMessage){

       //在TextView显示接收的消息,从这个类里拿属性.

       tv_title.setText(eventBusMessage.Message);

       Log.d("eventBusThread","ThreadMode.MAIN "+Thread.currentThread().getName());

    }


    //ThreadMode.POSTING表示该方法和消息发送方在同一个线程.

    @Subscribe(threadMode = ThreadMode.POSTING)

    public void MessageEventBus1(EventBusMessage eventBusMessage){

       Log.d("eventBusThread","ThreadMode.POSTING "+Thread.currentThread().getName());

    }


    /*ThreadMode.ASYNC也表示在后台执行(也就是子线程执行),可以异步并发处理

    (适用于多个线程任务处理,内部有线程池管理,比如请求网络时,用这个方法,他会自动创建线程去请求)

    无论发布者是在子线程还是主线程,该方法都会创建一个子线程,在子线程执行.*/

    @Subscribe(threadMode = ThreadMode.ASYNC)

    public void MessageEventBus2(EventBusMessage eventBusMessage){

       Log.d("eventBusThread","ThreadMode.ASYNC "+Thread.currentThread().getName());

    }


    //ThreadMode.BACKGROUND表示该方法在后台运行(也就是子线程),不能够并发处理

    //如果发布者在子线程,那么该方法就在子线程执行

    //如果发布者在主线程,那么该方法就会创建一个子线程,在子线程运行.

    @Subscribe(threadMode = ThreadMode.BACKGROUND)

    public void MessageEventBus3(EventBusMessage eventBusMessage){

       Log.d("eventBusThread","ThreadMode.BACKGROUND "+Thread.currentThread().getName());

    }

通过控制台所打印出来的线程名,总结一下输出数据:
在主线程发送事件 在子线程发送事件
main: 主线程 主线程
posting: 主线程 子线程
background: 新开一个子线程 子线程
async: 新开一个子线程 新开一个子线程

EventBus黏性事件使用

概念:黏性事件就是指在EventBus内部被缓存的那些事件 [2]
原理:EventBus为每个类(class)类型保存了最近一次被发送的事件——sticky。后续被发送过来的相同类型的sticky事件会自动替换之前缓存的事件。当一个监听者向EventBus进行注册时,它会去请求缓存事件。这时,缓存的事件就会立即自动发送给这个监听者,有一定的延时性.
使用场景:Android上跨Activity和Fragment生命周期传递数据这种复杂问题,异步调用等等

EventBus的黏性使用方法:(EventBus的环境搭建和EventBus基本使用是一致的)

猜你喜欢

转载自blog.csdn.net/life_s/article/details/80185063