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本身就是有序的

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助

因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
)]

[外链图片转存中…(img-5SvGlMo7-1715680765944)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 29
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值