关于事件通讯框架,相信大家比较熟悉的有这么两个:EventBus和LiveDataBus(还有RxBus,和LiveDataBusX没什么关系,我就略过了)。EventBus是老牌的框架了,相信大家最熟悉;而LiveDataBus是最近几年兴起的框架,基于AndroidX。使用过这两个框架的同学,我相信都能发现它们的优缺点,即便是LiveDataBus,网上很多博客都大肆的夸奖,看似毫无缺点,但是真正使用的时候,就能发现它的不足。这两个框架我都不是很陌生,源码及原理我在之前的博客都有介绍,源码更是翻了很多遍。针对这两个框架的缺点,开发了本章的主角---LiveDataBusX
EventBus的缺点其实还是很明显:(1)需要管理其生命周期(2)不能定向推送事件
第一个很好理解,需要进行register和unregister。第二个什么意思呢?我举一个例子:一个Activity中有两个Fragment,这两个Fragment都对TestBean这个类进行了订阅监听。EventBus在进行post操作时,只会发送TestBean对象,但是无法区分发送到哪个Fragment中。至于收到事件不去处理,这也是一种方法,但是并不能从根本上解决问题。
LiveDataBus即使被炒的很火,但是并不是没有缺点:(1)使用时的代码量略多(2)接收事件的onChange方法无法指定线程(3)注册对象必须为LifecycleOwner
(注:LiveDataBus的源码,网上应该有很多,如果有需要的朋友,可以在留言区留言)
第一个:代码量略多是什么鬼?看下面的代码
LiveDataBus
.getInstance()
.with("key", TestBean.class)
.observe(this, new Observer() {
@Override
public void onChanged(TestBeanbean) {
...
}
有同学会说,这也不多呀!基础代码才7行。这么看的确不多,如果监听10个事件呢,那么就是70行了,而EventBus出了register和unregister,基础代码只有3行,10个事件监听的话,只有32行。
第二个:很显而易见的问题,无法像EventBus一样,指定线程
第三个:如果想进行事件的监听,那么执行oberve方法的第一个参数必须是LifecycleOwner,当然这个是LiveDataBus的特点,无法解决的。
(1)生命周期管理:LiveDataBusX是在LiveDataBus基础上的升级,所以其生命周期管理和LiveDataBus一样
(2)定向事件发送:可以指定key值,并且可以设置动态的key值(关于key,我们在使用的时候介绍)
(3)代码量减少:使用方式和EventBus一样,只有一个注册方法,不需要解注册。并且接收事件的方法也和EventBus一样,使用注解的方式
(4)执行接收事件的线程:和EventBus一样,在注解中指定线程
(1)基础配置
在项目的buld.gradle中添加如下代码(jcenter中没有提交审核,所以需要添加这句,之后审核通过,这句话可以去掉)
allprojects {
repositories {
google()
jcenter()
maven {
url 'https://dl.bintray.com/codefarmerguan/LiveDataBusX'
}
}
}
在module的build.gradle中的defaultConfig中添加
javaCompileOptions {
annotationProcessorOptions {
arguments = [
OBSERVERS_CLASS_NAME: "MyObservers",
PACKAGE_NAME : "com.gzc.app"
]
}
}
PACKAGE_NAME:这里最好填包名
OBSERVERS_CLASS_NAME:指定一个类名,之后会在Application中进行设置。这个类会通过Apt自动生成。
(2)初始化操作
在项目Application的onCreate方法中进行如下操作
public class MyApp extends Application {
@Override
public void onCreate() {
super.onCreate();
LiveDataBusX.getInstance()
.setObservers(new MyObservers());
}
}
这里的MyObservers类就是上一步设置的OBSERVERS_CLASS_NAME的值
(3)事件监听
在需要接收事件的类中进行observe,和EventBus的register方法一样,不过不需要解注册,如下
//无动态key
LiveDataBusX.getInstance().observe(this);
//有动态key
LiveDataBusX.getInstance().observe(this,dynamicKey);
observe方法有两种:一种是无动态key,一种是有动态key。在某些业务场景下,key值可能会随某些属性而变化。
之后在类中写如下的方法来接收事件变化
@Observe(threadMode = ThreadMode.MAIN,sticky = false,append = false,key = "test1")
public void test1(Test1Bean test1Bean){
}
Observe注解有四个属性:
threadMode:指定线程,目前有MAIN,BACKGROUND,ASYNC三个值,和EventBus中的一样、
sticky:是否具有粘性,和EventBus中的粘性相似。究其原理,其实和粘性没有任何关系,执行现象和EventBus的粘性相似,我这里为了好解释,也就使用了sticky这个值
key:静态key
append:静态key与动态key是否拼接。如果没有设置动态key,这里一定要设置false,否则会出现问题
如果设置了动态key,并且append为true,最后的key形态为 静态key::动态key
如果append为false,那么最后的key就是静态key本身。使用者不需要关心这里的形态问题,这里只是做了解释
(4)事件发送
LiveDataBusX.getInstance()
.post("test1",new Test1Bean());
LiveDataBusX.getInstance()
.post("test1","动态key",new Test1Bean());
post也有两个方法,与observe的两个方法相对应。
如果没有动态key的情况,使用两参数的方法:第一个参数为静态key,第二个参数为事件对象
如果有静态key的情况,使用三参数的方法:第一个参数为静态key,第二个参数为动态key,第三个参数为事件对象
如果在使用上有疑问的话,大家可以在留言区留言,或者看使用示例
之后我会写一篇LiveDataBusX的原理和流程分析,来分享我的心得