EventBus的详细讲解及使用

###一、什么是EventBus
EventBus是Android下高效的发布/订阅事件总线机制。作用是可以代替传统的Intent、Handler、Broadcast或接口回调函数,在Fragment、Activity、Service以及线程之间去传递数据、执行方法。
EventBus的特点是代码简洁,它是一种发布订阅设计模式(Publish/Subsribe),或称作观察者设计模式。使用EventBus可以让模块与模块之间解耦。
####官方地址:https://github.com/greenrobot/EventBus
###二、如何获取

  1. Github主页:https://github.com/greenrobot/EventBus下载源码自行编译jar包
  2. AndroidStudio中之间所有maven依赖eventbus或者build.gradle中添加依赖:
    compile ‘de.greenrobot:eventbus:2.4.0’
    ###三、EventBus基本使用(三个步骤)

####步骤一:定义一个Event

//随便定义一个类
public class Event {
    public String msg;//定义一个参数
}

####步骤二:注册 & 注销 订阅者

  • 在该界面所在的oncrete()方法中添加:
EventBus.getDefault().register(this);//注册一个接收
  • 实现订阅方法,主要是重写四个方法:

 public void onEvent(Event event) {
        // 接收到事件之后,打印message信息
        Log.i(TAG,"receive onEvent ===" +  event.msg+"当前线程"+Thread.currentThread());
    }

    public void onEventMainThread(Event event) {
        // 接收到事件之后,打印message信息
        Log.i(TAG,"receive onEventMainThread ===" +  event.msg+"当前线程"+Thread.currentThread());
    }
    
    public void onEventBackgroundThread(Event event) {
        // 接收到事件之后,打印message信息
        Log.i(TAG,"receive onEventBackgroundThread ===" +  event.msg+"当前线程"+Thread.currentThread());
    }
    
    public void onEventAsync(Event event) {
        // 接收到事件之后,打印message信息
        Log.i(TAG,"receive onEventAsync ===" +  event.msg+"当前线程"+Thread.currentThread());
    }

#####步骤三:发布者发布事件

Event event1 = new Event();//该Event 就是我们之前创建的一个类
event1.msg = "我是来自TestEvent的消息";
EventBus.getDefault().post(event1);//在子线程中发布消息

###四、EventBus基本测试
####1、当我们在同一个Activity中注册监听,并发布事件时:

@Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        switch (keyCode) {
            case KeyEvent.KEYCODE_2:
                // 发布事件
                       *//* Event event1 = new Event();
                        event1.msg = "我是来自TestEvent的消息";
                        EventBus.getDefault().post(event1);//在子线程中发布消息*//*


                break;
        }
        return super.onKeyDown(keyCode, event);
    }

当我们点击键盘的“2”时,Android Monitor会打印如下的提示:
这里写图片描述

####2、当我们在同一个Activity中注册监听,并在其创建一个子线程发布事件时:

@Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        switch (keyCode) {
            case KeyEvent.KEYCODE_2:
                // 发布事件
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                       *//* Event event1 = new Event();
                        event1.msg = "我是来自TestEvent的消息";
                        EventBus.getDefault().post(event1);//在子线程中发布消息*//*

                    }
                }).start();
              
                break;
        }
        return super.onKeyDown(keyCode, event);
    }

打印的消息如下:
这里写图片描述
####3、当我们在同一个Activity中注册监听,在另一个Activity中发布事件时:

@Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        switch (keyCode) {
            case KeyEvent.KEYCODE_2:
                // 发布事件
           
                Event event1 = new Event();
                event1.msg = "我是来自TestEvent的消息";
                EventBus.getDefault().post(event1);//在子线程中发布消息
                break;
        }
        return super.onKeyDown(keyCode, event);
    }
  1. 直接跳转到B界面

这个时候我们由Main界面跳转到B界面,但是我们仍然在Main中打印信息(作为接受者)。如果我们直接点击调转,然后按“2”发布事件时,打印如下:
这里写图片描述

2.跳转后,我们点击返回键,然后再次跳转后显示:
这里写图片描述

五、EventBus四个方法讲解

总结:

通过上面的四个方法的分析,我们结合上面的测试,我们再次详细讲解四个关键方法的使用。

  1. onEvent:
    如果使用onEvent作为订阅函数,那么该事件在哪个线程发布出来的,onEvent就会在这个线程中运行,也就是说发布事件和接收事件线程在同一个线程。

  2. onEventMainThread
    如果使用onEventMainThread作为订阅函数,那么不论事件是在哪个线程中发布出来的,onEventMainThread都会在UI线程中执行,接收事件就会在UI线程中运行,这个在Android中是非常有用的,因为在Android中只能在UI线程中跟新UI,所以在onEvnetMainThread方法中是不能执行耗时操作的。

  3. onEventBackgroundThread
    使用onEventBackgrond作为订阅函数,如果发布者是子线程则直接执行;如果发布者不是子线程,则创建一个子线程再执行。

  4. onEventAsync
    使用这个函数作为订阅函数,那么无论事件在哪个线程发布,都会创建新的子线程再执行。适用于多个线程任务处理,内部由线程池管理。

至此,对于EventBus的详细使用我们先讲解到这里,对于源码的分析,我会在下个博文中为大家讲解,欢迎大家关注。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值