# App架构设计之BaseApplication(1)提到AppEventBus。下面想展开说说:
AppEventBus是使用MutableSharedFlow实现的消息总线组件;
1.设计消息总线的述求
- 满足上层与下层、同层之间通信;
- 维护状态,不需要具有粘性;
- 生命周期owner销毁可自动取消接收;
- 生命周期owner可灵活选择接收时机;
- 代码可读,可快速找到发起者跟消费者;
2.方案对比
| 粘性 | 自动取消 | 灵活 | 可读 | 原生 | ||
|---|---|---|---|---|---|---|
| LiveData | 是 | 是 | 是 | 是 | 是 | 是 |
| 广播 | 否 | 否 | 否 | 是 | 是 | 是 |
| EventBus | 可选择 | 是 | 是 | 否 | 否 | |
| 自定义 | 可定义 | 可定义 | 可定义 | 可定义 | 否 | |
| MutableSharedFlow | 可选择 | 是 | 是 | 是 | 是 |
欧耶,MutableSharedFlow完胜。我们主要讲MutableSharedFlow,当然是它完胜。
3.MutableSharedFlow特点
3.1 无粘性
注释1,默认replay是0,即无粘性,如果大于0,则有粘性;
public fun <T> MutableSharedFlow(
replay: Int = 0,//
extraBufferCapacity: Int = 0,
onBufferOverflow: BufferOverflow = BufferOverflow.SUSPEND
): MutableSharedFlow<T> {}
3.2 自动取消
代码中,event 是MutableSharedFlow对象;
注释1:这里选择在onCreate 利用Activity的lifecycleScope注册接收,在哪里会自动取消收集呢?
注释2:lifecycleScope实现类是LifecycleCoroutineScopeImpl,它会监听Activity销毁,当销毁时,会自动取消收集;
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
lifecycleScope.launch {//1
AppEventBus.event.collect{
//TODO 接收数据
}
}
LifecycleCoroutineScopeImpl实现类中
override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
if (lifecycle.currentState <= Lifecycle.State.DESTROYED) {
lifecycle.removeObserver(this)
coroutineContext.cancel()//2
}
}
3.3 灵活
可以灵活使用lifecycleScope.launchWhenXXX,决定收集的时机;
3.4.可读
在AS中,可快速找到发起者跟消费者;
3.5 原生
Android原生的。
4.MutableSharedFlow缺点
无法感知生命周期的变化。