事件总线设计模式在编程中非常受欢迎且有利。发布者触发事件和订户可以从任何地方收听这些事件。它减少了不必要的耦合。随着观察者和其他框架的到来,这种设计模式如今较少使用。为了实现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
共享流量变量以在需要时应用自定义逻辑。
第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上查看我的文章。