使用kotlin流中的Android中的事件总线图案
#kotlin #android #event #flow

事件总线设计模式在编程中非常受欢迎且有利。发布者触发事件和订户可以从任何地方收听这些事件。它减少了不必要的耦合。随着观察者和其他框架的到来,这种设计模式如今较少使用。为了实现Android中的活动广播,我们已经有以下选项:

  • rxbus
  • 本地广播
  • 第三方,即绿色机器人等

当Kotlin越来越受欢迎时,语言正在提供许多尖端的框架。流是其中之一。 Kotlin与该语言的1.4版本发布了稳定的状态流和共享流。我们可以使用共享流量实现EventBus设计模式,并利用语言和框架的好处。

执行

您可以使用以下简单步骤使用共享流量来实现事件总线:

步骤1:

创建一个通用事件总线类如下:

object EventBus {
  private val _events = MutableSharedFlow<Any>()
  val events = _events.asSharedFlow()

  suspend fun publish(event: Any) {
    _events.emit(event)
  }

  suspend inline fun <reified T> subscribe(crossinline onEvent: (T) -> Unit) {
    events.filterIsInstance<T>()
      .collectLatest { event ->
        coroutineContext.ensureActive()
        onEvent(event)
      }
  }
}

在这里,publish方法发布了事件作为参数传递的事件。订阅方法收集这些事件。它可以做一些实用程序工作,即过滤正确的事件,确保Coroutine上下文是否活动,然后在onEvent()方法上提供事件。此外,您可以收集public events共享流量变量以在需要时应用自定义逻辑。

Event Bus Flow

第2步:

创建事件类如下:

data class LoginEvent(
  val userId: String,
  val userName: String
)

理想情况下,您的活动类将是数据类,就像在任何情况下一样,您需要一些数据。但这可能是任何类别。

步骤3:

现在使用这些方法发布并订阅事件。根据模块或功能,创建单独的类是优选的。一个例子如下:

class LoginEventHandler {
  suspend fun postLoginEvent(loginEvent: LoginEvent) {
    EventBus.publish(loginEvent)
  }

  fun subscribeLoginEvent(lifecycleOwner: LifecycleOwner) {
    lifecycleOwner.lifecycleScope.launch {
      EventBus.subscribe<LoginEvent> { loginEvent ->
        Log.d("LoginEventHandler", "${loginEvent.userName} logged-in successfully")
      }
    }
  }
}

就是这样!!!

结论

活动巴士一直是开发人员中有争议的话题。有人说不应该遵循,因为它可以作为单个失败点。有时,可能很难调试活动的来源。
但是,对于许多用例,即在Internet连接性上更新UI,登录弹出弹出后,即在电子商务应用程序等中更新UI,在登录时进行刷新UI。在我看来,它不太依赖它。尽可能最少使用它。在评论中欢迎您的意见和方法。

您也可以在Medium上查看我的文章。