MutableSharedFlow实现消息总线的优势

292 阅读1分钟

# 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缺点

无法感知生命周期的变化。