您的位置:首页 > 其它

写给同事的EventBus使用指南(一)

2016-08-15 10:31 197 查看
尊重他人的劳动成果,转载请标明出处:http://blog.csdn.net/gengqiquan/article/details/52208975, 本文出自:【gengqiquan的博客】

关于EventBus,我想不需要我去讲太多它的优点,能知道这个库的基本也就知道它的优点了,不知道的等看完这篇使用指南自然也会发现它的优点。

本次讲解是基于 AndroidStudio的。

首先我们要找到EventBus的官网https://github.com/greenrobot/EventBus

我们可以看到首页里有以下的添加方式,添加进去



这里需要注意第一个坑,如果你的项目使用了代码混淆的话,需要在你项目的proguard-rules.pro添加如下代码

-keepattributes *Annotation*
-keepclassmembers class ** {
@org.greenrobot.eventbus.Subscribe <methods>;
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }

# Only required if you use AsyncExecutor
-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
<init>(java.lang.Throwable);
}


这串代码在官方库的Documentation的目录下的ProGuard文件里,前面为什么要贴出官方库的路径而不是直接贴依赖代码,是因为这个这些依赖方式和混淆规则是根据版本改变的。所以如果你选择了版本升级,需要去官方文档里看下混淆规则是否改变

现在我们开始在代码中使用

EventBus是单例模式,使用他的方法我们需要通过EventBus.getDefault()来获取单例对象



从图片我们可以看到EventBus的单例对象的public方法有10个,toString()方法不讲,从第一个方法开始

EventBus.getDefault().registered(this);


这一句是注册代码,注册的对象是this。这里的this是当前需要接受EventBus事件的组件,如activity和fragment。注册我们一般写在onCreate()或者onStart()方法里。需要注意的是,在组件中注册EventBus的话就必须在此组件里有一个标注了 @Subscribe注解的且访问权限为public的方法。这里注解方法我们下面再讲。

EventBus.getDefault().unregister(this);


这句是取消注册的代码,一般写在onDestory()方法里。注册和反注册(取消注册)是对应的,必须要添加,否则会引起组件的内存泄漏。因为注册的时候组件是被EventBus内部的单例队列所持有引用的。

需要注意的是Android的机制问题,组件是有可能由于内存原因被回收的,而activity在因为系统资源不足被强制销毁的时候,或者因为 launchMode的指定导致从后台回到前台的时候强制重新创建,这个时候系统会恢复activity从而导致 EventBus重复注册。fragment再重新创建的时候很可能会直接在内存中找到这个fragment从而也会导致 EventBus重复注册,所以我们在注册的时候需要加一个注册保护,去判断是否该组件已经注册了

if (!EventBus.getDefault().isRegistered(this))
EventBus.getDefault().register(this);


前面提到注册的组件必须要有一个标注了 @Subscribe注解的且访问权限为public的方法,这个方法的作用就是用来接受EventBus的事件的,比如我在一个activity里发出了一个更改fragment界面数据的事件,

我就在需要更改界面数据的fragment里注册一个这样的方法

@Subscribe
public void onEvent(CommentChangeEvent event) {
//change view data
}


然后在activity里发送一个更改界面的事件信号

EventBus.getDefault().post(new CommentChangeEvent());


上面的CommentChangeEvent 是自己定义的数据类,为什么要定义这个?EventBus是怎样知道他发送的事件由谁来接受的呢?他要让别人更改界面数据或者做一些事情,怎么让系统知道谁应该响应这个要求呢?使用过 startActivityForResult的我们都知道要想知道返回的result由谁执行,需要加一个requestCode。这里的CommentChangeEvent类就起到了一样的识别作用,EventBus会把这个事件通知给所有参数为CommentChangeEvent的注册方法。

我们来看下CommentChangeEvent的定义

public class CommentChangeEvent {

public CommentChangeEvent() {
}
}


可以看到就是一个空类,当然我们也可以给这个类添加属性,在发送事件的地方给这个类的实例赋值,然后在注册的方法里取值。

以上就是EventBus的简单用法了,我们发现EventBus通知识别是根据参数类的类型来决定的,那么一旦我们项目中有大量的地方需要进行组件间通信。势必会有大量的event类。这样会显得项目臃肿,我们可以定义一个event基本类,然后在里面定义静态内部类,以此解决定义过多event类的问题。

由于不想把博客写的又臭又长,所以决定按阶段分几篇来写。

我建了一个QQ群(群号:121606151),用于大家讨论交流Android技术问题,有兴趣的可以加下,大家一起进步。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息