EventBus → SharedFlow

EventBus → SharedFlow

老写法(Java + EventBus)

java 复制代码
// 发送事件
EventBus.getDefault().post(new LoginEvent(userId));

// 接收事件
@Subscribe(threadMode = ThreadMode.MAIN)
public void onLoginEvent(LoginEvent event) {
    updateUI(event.getUserId());
}

// 注册/解注册
@Override
protected void onStart() {
    super.onStart();
    EventBus.getDefault().register(this);
}

@Override
protected void onStop() {
    super.onStop();
    EventBus.getDefault().unregister(this);
}

问题在哪里

EventBus 通过反射查找 @Subscribe 注解方法,性能损耗虽不大但存在。事件的发送方和接收方之间完全无约束,编译期不检查事件类型。忘调 register/unregister 是常见 bug 来源。全局事件满天飞,难以追踪事件的流向。

新写法(Kotlin + SharedFlow)

kotlin 复制代码
// 单例事件总线
object EventBus {
    private val _events = MutableSharedFlow<Any>(replay = 0,
            extraBufferCapacity = 64)
    val events: SharedFlow<Any> = _events

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

// 发送
viewModelScope.launch { EventBus.post(LoginEvent(userId)) }

// 接收
viewLifecycleOwner.lifecycleScope.launch {
    viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) {
        EventBus.events.collect { event ->
            when (event) {
                is LoginEvent -> updateUI(event.userId)
            }
        }
    }
}

一句话注意

SharedFlow 替代 EventBus 的最大好处是类型安全------when (event) 配合 sealed class 定义事件,IDE 会提示所有可能的事件类型,不会遗漏。而且不需要 register/unregister,协程取消就自动停止接收。

extraBufferCapacity = 64 是为了没有消费者时也能缓存事件(类似 EventBus 的 sticky)。如果不需要 sticky,设 replay = 0, extraBufferCapacity = 0 并在 emit 时检查是否有订阅者。


Java Android 老项目迁移系列,持续更新中。

相关推荐
骑着蜗牛撵大象32724 分钟前
2026 后端 AI 工程化:Spring AI 管调用、MCP 管工具、Agent 内嵌管自治
java·人工智能·后端·spring·ai·可观测性·mcp
tryxr27 分钟前
JVM 垃圾回收机制
java·jvm·gc·垃圾回收
传奇开心果编程1 小时前
【Jetpack Compose娓娓道来】第29课:状态容器与UI事件建模——把“散装状态”变成“可穷举的契约”
android·kotlin·移动开发·android jetpack·ui框架·开发范式·声明式ui
揣一尾游鱼yu1 小时前
Spring上(IOC)笔记
java·笔记·spring·ioc
荣码2 小时前
长上下文与大文档处理:200页PDF怎么喂给AI,我踩了4个坑
java·python
五彩小白2 小时前
喵呜打卡项目总结
android·团队开发
极限挑战哥2 小时前
共享电单车联营平台分账架构实践:二清合规与自动分账零人工方案
java·大数据·人工智能·微信小程序·架构·微信公众平台
皮皮林5512 小时前
比 VMware 更快,更轻的虚拟机,横空出世!
java
Thomas.Sir3 小时前
第13课:MyBatis-Plus整合SpringBoot4.x,分页、条件查询、逻辑删除实战
java·spring boot
meiying88383 小时前
多快递公司快递单号批量查询接口怎么对接?Python 聚合查询实现
java·大数据·python