EventBus3.0的入门和使用

前因

因为公司项目中使用EventBus,所以需要进行了解,本来还以为EventBus会很难理解,但是网上查了一下,发现上手很快,而且也没有什么特别难懂的地方,这篇文章记录我对EventBus的一些理解

使用场景

经常会遇到,有时候发生了一个事件,需要在别的activity或者Fragment或者其他类中进行处理,以前我们是通过广播去实现,但是当一个Activity需要处理很多种事件时,广播管理起来就会麻烦很多,尤其是对于一些多线程之间的消息,用广播和handler固然可以,但是消息过多处理起来就比较麻烦了,所以EventBus就出现了(以上纯属个人理解)

EventBus概述

EventBus是一款针对Android优化的发布/订阅事件总线。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息.优点是开销小,代码更优雅。以及将发送者和接收者解耦。
1、下载EventBus
github

gradle

COPY
1
compile 'org.greenrobot:eventbus:3.0.0'

Maven

COPY
1
2
3
4
5
<dependency>
<groupId>org.greenrobot</groupId>
<artifactId>eventbus</artifactId>
<version>3.0.0</version>
</dependency>
基本使用

1、首先每个事件写一个实体bean,EventBus就是根据这个实体bean来判断事件分发的

COPY
1
2
public class EventBusBean{
}

就创建一个空类就可以,当然如果需要通过消息传递什么对象,那个对象的类就是这个类文件
2、在要接受消息的页面注册EventBus

COPY
1
EventBus.getDefault().register(this);  

3、实现处理方法
在3.0以前一直是通过以下4个方法名来实现消息处理

a、onEvent
b、onEventMainThread
c、onEventBackgroundThread
d、onEventAsync
每个方法名都有不同的含义

onEvent:如果使用onEvent作为订阅方法,那么该事件在哪个线程发布出来的,onEvent就会在这个线程中运行,也就是说发布事件和接收事件线程在同一个线程。使用这个方法时,在onEvent方法中不能执行耗时操作,如果执行耗时操作容易导致事件分发延迟。

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

onEventBackground:如果使用onEventBackgrond作为订阅方法,那么如果事件是在UI线程中发布出来的,那么onEventBackground就会在子线程中运行,如果事件本来就是子线程中发布出来的,那么onEventBackground函数直接在该子线程中执行。

onEventAsync:使用这个函数作为订阅方法,那么无论事件在哪个线程发布,都会创建新的子线程在执行onEventAsync.
实现处理方法有4个方法可以实现,不用继承或实现任何接口,只需要在你注册的类中添加方法就行了,当然方法名是有限制的,参数就是你要传递的消息对象

但是3.0以后就不在用这种方式了,而是通过注解的方式

通过注解@Subscribe来确定实现的方法,当然还需要方法的形参,只是把以前的特定方法名改为不特定,而是通过注解,同时通过threadMode来设定线程,一共有4种方式,同以前一样

a、ThreadMode.POSTING  同onEvent
b、ThreadMode.MAIN   同onEventMainThread
c、ThreadMode.BACKGROUND  同onEventBackground
d、ThreadMode.ASYNC  同onEventAsync
如:@Subscribe(threadMode = ThreadMode.POSTING)

比如我们用onEventMainThread来注册,这样onEventMainThread方法体会在UI线程去执行

COPY
1
2
3
public void onEventMainThread(EventBusBean bean){
...
}

4、发送消息

COPY
1
EventBus.getDefault().post(new EventBusBean());

或者

COPY
1
2
//postSticky 发送粘性消息,同粘性广播相同,发送后会保存,在后面注册的也能接收到
EventBus.getDefault().postSticky(new EventBusBean());

5、取消注册
当一个类被销毁或者生命周期完成时,我们要及时取消注册,以免造成内存泄露

COPY
1
EventBus.getDefault().unregister(this);

以下链接是我写的一个关于EventBus3.0的demo,有兴趣可以去看看

EventBus3.0Demo

Authorship: 作者
Article Link: https://raye.wang/2016/03/23/EventBus3-0%E7%9A%84%E5%85%A5%E9%97%A8%E5%92%8C%E4%BD%BF%E7%94%A8/
Copyright: All posts on this blog are licensed under the CC BY-NC-SA 4.0 license unless otherwise stated. Please cite Raye Blog !