EventBus → SharedFlow
老写法(Java + EventBus)
1// 事件定义 2public class LoginEvent { 3 private long userId; 4 public LoginEvent(long userId) { this.userId = userId; } 5 public long getUserId() { return userId; } 6} 7 8// 发送 9EventBus.getDefault().post(new LoginEvent(123)); 10 11// 接收 12@Subscribe(threadMode = ThreadMode.MAIN) 13public void onLogin(LoginEvent event) { 14 updateUI(event.getUserId()); 15} 16
问题在哪里
EventBus 依赖反射查找 @Subscribe 方法,有轻微性能开销。事件发送和接收完全靠运行时匹配,编译期无任何检查。过多全局事件后变得难以追踪。
新写法(SharedFlow)
1// 事件定义 — sealed class 类型安全 2sealed class AppEvent { 3 data class Login(val userId: Long) : AppEvent() 4 data class Logout(val reason: String) : AppEvent() 5} 6 7// 事件总线 8object EventBus { 9 private val _events = MutableSharedFlow<AppEvent>(extraBufferCapacity = 64) 10 val events: SharedFlow<AppEvent> = _events 11 12 suspend fun emit(event: AppEvent) { _events.emit(event) } 13} 14 15// 发送 16viewModelScope.launch { EventBus.emit(AppEvent.Login(123)) } 17 18// 接收 19lifecycleScope.launch { 20 repeatOnLifecycle(Lifecycle.State.STARTED) { 21 EventBus.events.collect { event -> 22 when (event) { 23 is AppEvent.Login -> updateUI(event.userId) 24 is AppEvent.Logout -> handleLogout(event.reason) 25 } 26 } 27 } 28} 29
一句话注意
sealed class 的优势在于 when 分支的穷举检查——加了新事件类型但忘了处理,编译直接报错。EventBus 的 @Subscribe 是运行时才发现遗漏。
SharedFlow 不需要 register/unregister,协程 scope 取消自动停止收集。生命周期感知由 repeatOnLifecycle 处理,比 EventBus 的 @Subscribe + 手动 register 干净得多。
Java Android 老项目迁移系列,持续更新中。
《EventBus → SharedFlow》 是转载文章,点击查看原文。

