基于LiveData,实现eventBus,事件统一管理,动态APT生成,生命周期管理
其实使用LiveData实现基本的EventBus并不难,凡是看过基本原理的人,都可以轻松实现一套自己的EventBus, 唯一困难的地方就是,遇到粘性事件时会有一个bug,注册之前产生的事件有时候也会发射到后注册的接收者。 目前网上解决方案分两种:
- 方案1:用反射获取系统变量并干预
- 方案2:通过修改包名取巧使用系统包可见变量
因为无论是反射还是包可见变量访问,后期都会有可能出现兼容问题,甚至混淆的时候也有可能引入问题。 本方案使用包装类,对事件进行了统一的封装,通过框架自己记录注册版本来解决粘性事件问题,这种方案既不会有兼容问题,也不需要在混淆的时候进行特殊设置。 因此在此分享出来,希望可以给大家一个参考
- 支持分组处理,可设定激活状态
- 自动生成事件相关代码,防止事件定义冲突
- 支持自定义消息
- 整个生命周期(从onCreate到onDestroy)都可以实时收到消息
- 激活状态(Started)可以实时收到消息,非激活状态(Stopped)无法实时收到消息,需等到Activity重新变成激活状态,方可收到消息
- 支持AndroidX
- 支持设置LifecycleObserver(如Activity)接收消息的模式:
master
核心代码实现 + demo
demo
通过依赖方式引用master生成的库
combine
通过本地方式依赖master代码
implementation 'com.github.codyer.ElegantBus:core:1.0.0'
annotationProcessor 'com.github.codyer.ElegantBus:compiler:1.0.0'
- 升级方式--Refactor->Migrate to AndroidX
- 项目降级--请自行降级 Refactor->Migrate App to AppCompat
- 支持配置以区域为单位的事件开关
- 统一事件管理
- 根据实际情况开启关闭事件定义
- 事件分领域(group),不同领域同名事件互不干扰
@EventGroup(name = "demo",active = true)
public enum AppDemo {
@Event(description = "定义一个测试事件",data = String.class)testString,
@Event(description = "定义一个测试事件测试对象",data = TestBean.class)testBean,
}
- observe
ElegantBus.begin()
.inGroup(Group$demo.class)// Group$***为自动生成的事件接口
.withEvent$testBean()
.observe(this, new ObserverWrapper<TestBean>() {
@Override
public void onChanged(TestBean testBean) {
}
});
- observeAny
ElegantBus.begin()
.inGroup(Group$demo.class)
.withEvent$testBean()
.observeAny(this, new ObserverWrapper<TestBean>() {
@Override
public void onChanged(@Nullable TestBean testBean) {
}
});
- observeForever
ElegantBus.begin()
.inGroup(Group$demo.class)
.withEvent$testBean()
.observeForever(new ObserverWrapper<TestBean>() {
@Override
public void onChanged(@Nullable TestBean testBean) {
}
});
ElegantBus.begin()
.inGroup(Group$demo.class)
.withEvent$testBean().
.removeObserver(observer);
ElegantBus.begin()
.inGroup(Group$demo.class)
.withEvent$testBean()
.removeObservers(this);
- setValue(Object o)
ElegantBus.begin()
.inGroup(Group$demo.class)
.withEvent$testBean()
.setValue(value);
- postValue(Object o)
ElegantBus.begin()
.inGroup(Group$demo.class)
.withEvent$testBean()
.postValue(value);
暂无
compileSdkVersion 28
defaultConfig {
minSdkVersion 19
targetSdkVersion 28
versionCode 1
versionName 1.0.0
}
版本 | 功能 |
---|---|
1.0.0 | 初版,支持基本功能 |
请参考Component 下的代码
- 主要功能完成(Apr. 3, 2019)
- 欢迎提Issue与作者交流
- 欢迎提Pull request,帮助 fix bug,增加新的feature,让ElegantBus变得更强大、更好用
- ElegantBus的实现原理可参见作者在美团技术博客上的博文: Android消息总线的演进之路:用LiveDataBus替代RxBus、EventBus
- 该博文是初版ElegantBus的实现原理,与当前版本的实现可能不一致,仅供参考
- invoking-message 消息总线框架,基于ElegantBus实现。它颠覆了传统消息总线定义和使用的方式,通过链式的方法调用发送和接收消息,使用更简单