LiveEventBus
LiveEventBus 是一款 Android 消息总线,基于 LiveData,具有生命周期感知能力,支持 Sticky,支持 AndroidX,支持跨进程,支持跨 APP
为什么要用 LiveEventBus
生命周期感知
- [x] 消息随时订阅,自动取消订阅
- [x] 告别消息总线造成的内存泄漏
- [x] 告别生命周期造成的崩溃
范围全覆盖的消息总线解决方案
- [x] 进程内消息发送
- [x] App 内,跨进程消息发送
- [x] App 之间的消息发送
更多特性支持
- [x] 免配置直接使用,懒人最爱
- [x] 支持 Sticky 粘性消息
- [x] 支持 AndroidX
- [x] 支持延迟发送
- [x] 观察者的多种接收模式(全生命周期/激活状态可接受消息)
常用消息总线对比
消息总线 | 延迟发送 | 有序接收消息 | Sticky | 生命周期感知 | 跨进程/APP | 线程分发 |
---|---|---|---|---|---|---|
EventBus | :x: | :white_check_mark: | :white_check_mark: | :x: | :x: | :white_check_mark: |
RxBus | :x: | :x: | :white_check_mark: | :x: | :x: | :white_check_mark: |
LiveEventBus | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: |
想了解更多?请点击:全面了解 Android 消息总线
使用
1.8 及以上版本全面迁移至 maven,同时 groupID 变为 io.github.jeremyliao,1.8 以下版本保留 JCenter
maven
- 非 AndroidX
implementation 'io.github.jeremyliao:live-event-bus:1.8.0'
- AndroidX
implementation 'io.github.jeremyliao:live-event-bus-x:1.8.0'
JCenter
- 非 AndroidX
implementation 'com.jeremyliao:live-event-bus:1.7.3'
- AndroidX
implementation 'com.jeremyliao:live-event-bus-x:1.7.3'
快速开始
订阅消息
以生命周期感知模式订阅消息
LiveEventBus .get("some_key", String.class) .observe(this, new Observer<String>() { @Override public void onChanged(@Nullable String s) { } });
以 Forever 模式订阅消息
LiveEventBus
.get("some_key", String.class)
.observeForever(observer);
发送消息
不定义消息直接发送
LiveEventBus .get("some_key") .post(some_value);
先定义消息,再发送消息
public class DemoEvent implements LiveEvent {
public final String content;
public DemoEvent(String content) {
this.content = content;
}
}
LiveEventBus
.get(DemoEvent.class)
.post(new DemoEvent("Hello world"));
详细使用文档
获取 Observable
通过 name 获取 Observable
Observable<T> get(@NonNull String key, @NonNull Class<T> type)
Observable<Object> get(@NonNull String key)
通过 event type 获取 Observable
<T extends LiveEvent> Observable<T> get(@NonNull Class<T> eventType)
消息发送
进程内发送消息
void post(T value)
App 内发送消息,跨进程使用
void postAcrossProcess(T value)
App 之间发送消息
void postAcrossApp(T value)
进程内发送消息,延迟发送
void postDelay(T value, long delay)
进程内发送消息,延迟发送,带生命周期
void postDelay(LifecycleOwner sender, T value, long delay)
进程内发送消息,有序发送
void postOrderly(T value)
以广播的形式发送一个消息
- 需要跨进程、跨 APP 发送消息的时候调用该方法
- 建议尽量使用 postAcrossProcess、postAcrossApp
void broadcast(T value, boolean foreground, boolean onlyInApp)
消息订阅
以生命周期感知模式订阅消息
- 具有生命周期感知能力,LifecycleOwner 销毁时自动取消订阅,不需要调用 removeObserver
void observe(@NonNull LifecycleOwner owner, @NonNull Observer<T> observer)
以 Forever 模式订阅和取消订阅消息
- Forever 模式订阅消息,需要调用 removeObserver 取消订阅
void observeForever(@NonNull Observer<T> observer)
取消订阅消息
void removeObserver(@NonNull Observer<T> observer)
Sticky 模式订阅消息
- Sticky 模式
- 支持在订阅消息的时候设置 Sticky 模式,这样订阅者可以接收到之前发送的消息。
- 以 Sticky 模式订阅消息,具有生命周期感知能力,LifecycleOwner 销毁时自动取消订阅,不需要调用 removeObserver
void observeSticky(@NonNull LifecycleOwner owner, @NonNull Observer<T> observer)
Sticky 模式 Forever 订阅消息
- Forever 模式订阅消息,需要调用 removeObserver 取消订阅,Sticky 模式
void observeStickyForever(@NonNull Observer<T> observer)
跨进程消息
支持对基本数据类型消息的跨进程发送
- int
- float
- long
- boolean
- double
- String
支持 Serializable 和 Parcelable 类型消息的跨进程发送
- 提供 SerializableProcessor
- 提供 ParcelableProcessor
支持 Bean 类型消息的跨进程发送
- 提供 GsonProcessor 以 Gson 方式提供支持
需要用注解@IpcConfig 指定 GsonProcessor:
@IpcConfig(processor = GsonProcessor.class)
1.8 及以上版本由于拆分了 GsonProcessor,需要引入 lebx-processor-gson
非 AndroidX
implementation 'io.github.jeremyliao:leb-processor-gson:x.x.x'
- AndroidX
implementation 'io.github.jeremyliao:lebx-processor-gson:x.x.x'
支持自定义扩展
- 实现自定义 Processor,实现 Processor 接口
- 用注解@IpcConfig 指定自定义 Processor
老版本文档
更多使用场景
SmartEventBus
SmartEventBus 是一个 Android 平台的消息总线框架,这是一款非常 smart 的消息总线框架,能让你定制自己的消息总线。 SmartEventBus
在组件化中使用 LiveEventBus
配置
在 Application.onCreate 方法中配置:
LiveEventBus
.config()
...
lifecycleObserverAlwaysActive 配置 LifecycleObserver(如 Activity)接收消息的模式(默认值 true)
autoClear 配置在没有 Observer 关联的时候是否自动清除 LiveEvent 以释放内存(默认值 false)
更多配置信息,请点击:LiveEventBus 的配置
混淆规则
-dontwarn com.jeremyliao.liveeventbus.**
-keep class com.jeremyliao.liveeventbus.** { *; }
-keep class android.arch.lifecycle.** { *; }
-keep class android.arch.core.** { *; }
for androidx:
-dontwarn com.jeremyliao.liveeventbus.**
-keep class com.jeremyliao.liveeventbus.** { *; }
-keep class androidx.lifecycle.** { *; }
-keep class androidx.arch.core.** { *; }
常见问题 Q&A
Issues 上最经常被提问的问题
Q:收不到消息怎么办?
A:通过 Console.getInfo()获取即时的调试信息,主要去观察对应的 key 下面有没有你关注的 Observer(Console 的用法)
*********Event info********* Event name: key_test_delay_life version: -1 hasActiveObservers: true hasObservers: true ActiveCount: 1 ObserverCount: 1 Observers: [com.jeremyliao.liveeventbus.core.LiveEventBusCore$ObserverWrapper@992681d=android.arch.lifecycle.ExternalLiveData$ExternalLifecycleBoundObserver@bc258f4]
Q:收到重复的消息怎么办?
A:同样通过 Console.getInfo()获取即时的调试信息,主要去观察有没有重复注册的 Observer(Console 的用法)
Q:JCenter 要关闭了,什么时候迁移?
A:1.8 及以上版本全面迁移至 maven,同时 groupID 变为 io.github.jeremyliao,1.8 以下版本保留 JCenter
Q:如何传递 List
或者 Pair 这种泛型对象? A:代码上的写法有两种,供参考:
LiveEventBus .get(KEY_TEST_OBSERVE_FOREVER, List.class) .observeForever(new Observer<List>() { @Override public void onChanged(@Nullable List list) { List<String> stringList = list; } });
Observable<List<String>> observable = LiveEventBus.get(KEY_TEST_OBSERVE_FOREVER); observable.observeForever(new Observer<List<String>>() { @Override public void onChanged(@Nullable List<String> strings) { } });
Q:项目中不用 Gson 库,如何去掉依赖?
A:使用 1.8 以上的版本,对 gson 相关代码进行了拆分
若问题不能解决,请提 issue。
其他分支版本
AndroidX
- [x] 支持 AndroidX
- [x] 同 master 版本一致
classic
- [x] 经典实现版,整个实现就一个 java 文件
- [x] 只支持激活状态(Started)可以实时收到消息,非激活状态(Stoped)无法实时收到消息,需等到 Activity 重新变成激活状态,方可收到消息
- [x] 不支持跨进程通信
v2
- [x] v2 版,历史版本,已废弃
- [x] 为了解决非激活态不能实时收到消息的问题,采用修改 LiveData 源码的方式实现
示例和 DEMO
文档
实现原理
- LiveEventBus 的实现原理可参见作者在美团技术博客上的博文: Android 消息总线的演进之路:用 LiveDataBus 替代 RxBus、EventBus
- 该博文是初版 LiveEventBus 的实现原理,与当前版本的实现可能不一致,仅供参考
质量
- [x] 编写了 30 个测试用例以确保 LiveEventBus 能够正常运行。
- [x] 具体测试用例参见LiveEventBusTest
版本
版本 | 功能 |
---|---|
1.8.x | 迁移至 maven,拆分 gson-converter |
1.7.x | 优化接口设计,优化实现逻辑,修复一些问题 |
1.6.x | 优化接口设计,优化实现逻辑,修复一些问题 |
1.5.x | 优化接口设计,使用起来更简洁 |
1.4.x | 简化对外暴露的接口,重构核心实现,支持前后台线程调用 |
1.3.x | 支持跨进程、跨 APP 通信 |
1.2.x | 支持接收消息的模式,支持 AndroidX |
1.1.x | 修复了一些问题 |
1.0.x | 初版,支持基本功能 |
主要功能提交记录
- 主要功能完成(Jul 11, 2018)
- 支持 Sticky(Aug 8, 2018)
- 修复在后台线程 PostValue 会丢失消息的问题(Aug 9, 2018)
- 解决发送给 Stop 状态 Observer 消息无法及时收到的问题(Aug 18, 2018)
- 解决了 Resumed 状态的 Activity 发生订阅,订阅者会收到订阅之前发布的消息的问题。特别感谢@MelonWXD 发现了这个问题(Dec 8,2018)
- 在 removeObserver 的时候,检查 livedata 上有没有 observer,没有则删除这个 livadata,以减少内存占用。特别感谢@GreenhairTurtle 提供的解决方案(Dec 27,2018)
- 支持设置 LifecycleObserver 接收消息的模式,支持在整个生命周期实时接收消息和只在激活态实时接收消息两种模式(Jan 22,2019)
- 支持 AndroidX(Mar 8,2019)
- 支持跨进程、跨 APP(Mar 26,2019)
- 简化对外暴露的接口,重构核心实现,支持前后台线程调用(Apr 4,2019)
其他
- 欢迎提 Issue 与作者交流
- 欢迎提 Pull request,帮助 fix bug,增加新的 feature,让 LiveEventBus 变得更强大、更好用
More Open Source by JeremyLiao
- InterfaceLoader 史上最好用的 Android 跨进程接口调用框架件
- FastSharedPreferences 一个 Android 平台的高性能 key-value 组件
- SmartEventBus SmartEventBus 是一个 Android 平台的消息总线框架,这是一款非常 smart 的消息总线框架,能让你定制自己的消息总线。
- android-modular 一套 Android 组件化的实施方案和支撑框架
- DataLoader 一个 Android 异步数据加载框架,用于 Activity 打开之前预加载数据,页面启动速度优化利器
更多,请点击
深入学习 Android 系列,让你精通 Android
Flutter 系列
- JeremyLiao/flutter-learn
- alibaba/flutter-go
Kotlin 系列
- MindorksOpenSource/from-java-to-kotlin
- JeremyLiao/kotlin-compare-to-java
Gradle 系列
- JeremyLiao/android-gradle-study
算法系列
- labuladong/fucking-algorithm
测试系列
- JeremyLiao/jacoco-android-demo