LiveDataBus的升级版--LiveDataBusX

       关于事件通讯框架,相信大家比较熟悉的有这么两个:EventBus和LiveDataBus(还有RxBus,和LiveDataBusX没什么关系,我就略过了)。EventBus是老牌的框架了,相信大家最熟悉;而LiveDataBus是最近几年兴起的框架,基于AndroidX。使用过这两个框架的同学,我相信都能发现它们的优缺点,即便是LiveDataBus,网上很多博客都大肆的夸奖,看似毫无缺点,但是真正使用的时候,就能发现它的不足。这两个框架我都不是很陌生,源码及原理我在之前的博客都有介绍,源码更是翻了很多遍。针对这两个框架的缺点,开发了本章的主角---LiveDataBusX

EventBus和LiveDataBus到底有什么缺点呢

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的特点,无法解决的。

 

LiveDataBusX可以很好解决上面的问题(注册对象为LifecycleOwner的问题是无法解决的)

(1)生命周期管理:LiveDataBusX是在LiveDataBus基础上的升级,所以其生命周期管理和LiveDataBus一样

(2)定向事件发送:可以指定key值,并且可以设置动态的key值(关于key,我们在使用的时候介绍)

(3)代码量减少:使用方式和EventBus一样,只有一个注册方法,不需要解注册。并且接收事件的方法也和EventBus一样,使用注解的方式

(4)执行接收事件的线程:和EventBus一样,在注解中指定线程

 

LiveDataBusX的使用

(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的原理和流程分析,来分享我的心得

 

你可能感兴趣的:(移动架构,android)