Kotlin就几行代码? 用SharedFlow写个FlowEventBus

SharedFlow作为事件载体 :

优点:

  • 依托协程轻松切换线程

  • 可以通过replay实现粘性效果

  • 可以被多个观察者订阅

  • 无观察者自动清除事件不会造成积压

结合 Lifecycle 感知生命周期,做到响应时机可控 。不仅可以全局范围的事件,也可以单页面内的通信而不透传到别的页面,如:Activity内部Fragment内部通信。

依赖库版本

关键在于 kotlinx-coroutines > 1.4.xlifecycle-runtime-ktx > 2.3.x

API

以下示例中的Event均是随意定义的类,只是测试时为了区分事件而定义的名字

事件发送

//全局范围

postEvent(AppScopeEvent(“form TestFragment”))

//Fragment 内部范围

postEvent(fragment,FragmentEvent(“form TestFragment”))

//Activity 内部范围

postEvent(requireActivity(),ActivityEvent(“form TestFragment”))

复制代码

事件监听

//接收 Activity Scope事件

observeEvent(scope = requireActivity()) {

}

//接收 Fragment Scope事件

observeEvent(scope = fragment) {

}

//接收 App Scope事件

observeEvent {

}

Like ObserveForever:

//此时需要指定协程范围

observeEvent(scope = coroutineScope) {

}

延迟发送

postEvent(CustomEvent(value = “Hello Word”),1000)

复制代码

线程切换

observeEvent(Dispatchers.IO) {

}

指定可感知的最小生命状态

observeEvent(minActiveState = Lifecycle.State.DESTROYED) {

}

以粘性方式监听

observeEvent(isSticky = true) {

}

移除粘性事件

removeStickyEvent(StickyEvent::class.java)

removeStickyEvent(fragment,StickyEvent::class.java)

removeStickyEvent(activity,StickyEvent::class.java)

原理


以上功能依托于Kotlin协程的SharedFlowLifecycle 因此实现起来非常简单。

粘性事件

MutableSharedFlow(

replay = if (isSticky) 1 else 0,

extraBufferCapacity = Int.MAX_VALUE //避免挂起导致数据发送失败

)

生命周期感知

fun LifecycleOwner.launchWhenStateAtLeast(

minState: Lifecycle.State,

block: suspend CoroutineScope.() -> T

) {

lifecycleScope.launch {

lifecycle.whenStateAtLeast(minState, block)

}

}

切换线程

whenStateAtLeast 由于执行的block默认是在主线程,因此需要手动切换线程:

lifecycleOwner.launchWhenStateAtLeast(minState) {

flow.collect { value ->

lifecycleOwner.lifecycleScope.launch(dispatcher) {

onReceived.invoke(value as T)

}

}

}

延迟事件

viewModelScope.launch {

delay(time)

flow.emit(value)

}

有序分发

Flow本身就是有序的

资源分享

  • 最新大厂面试专题

这个题库内容是比较多的,除了一些流行的热门技术面试题,如Kotlin,数据库,Java虚拟机面试题,数组,Framework ,混合跨平台开发,等

  • 对应导图的Android高级工程师进阶系统学习视频
    最近热门的,NDK,热修复,MVVM,源码等一系列系统学习视频都有!


《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!
除了一些流行的热门技术面试题,如Kotlin,数据库,Java虚拟机面试题,数组,Framework ,混合跨平台开发,等

[外链图片转存中…(img-Owkrkgix-1715848077908)]

  • 对应导图的Android高级工程师进阶系统学习视频
    最近热门的,NDK,热修复,MVVM,源码等一系列系统学习视频都有!

[外链图片转存中…(img-8htUYYG2-1715848077912)]
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值