文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

KotlinStateFlow单数据更新热流设计与使用介绍

2024-04-02 19:55

关注

一.StateFlow的设计

StateFlow是一种单数据更新的热流,通过emit方法更新StateFlow的数据,通过value属性可以获取当前的数据。在StateFlow中,核心接口的继承关系如下图所示:

1.StateFlow接口

StateFlow接口继承自SharedFlow接口,代码如下:

public interface StateFlow<out T> : SharedFlow<T> {
    // 当前的数据
    public val value: T
}
// StateFlow
val stateFlow = MutableStateFlow(initialValue)
// 与StateFlow行为相同的SharedFlow
// 注意参数
val sharedFlow = MutableSharedFlow(
            replay = 1,
            extraBufferCapacity = 0, 
            onBufferOverflow = BufferOverflow.DROP_OLDEST)
// 设置初始值
sharedFlow.tryEmit(initialValue)
// distinctUntilChanged方法,只有当前后发射的两个数据不同时才会将数据向下游发射
val state = sharedFlow.distinctUntilChanged()

StateFlow与ConflatedBroadcastChannel的区别:从概念上讲,StateFlow与ConflatedBroadcastChannel很相似,但二者也有很大的差别,推荐使用StateFlow,StateFlow设计的目的就是要在未来替代ConflatedBroadcastChannel:

2. MutableStateFlow接口

MutableStateFlow接口继承自MutableSharedFlow接口与StateFlow接口,并在此基础上定义了一个新方法compareAndSet,代码如下:

public interface MutableStateFlow<T> : StateFlow<T>, MutableSharedFlow<T> {
    // 当前数据
    public override var value: T
    // 通过CAS的方式,更新value
    // 如果except与value相等,则将value更新为update,并返回true
    // 如果except与value不相等,不做任何操作,直接返回false
    // 如果except、value、update同时相等,不做任何操作,直接返回true
    public fun compareAndSet(expect: T, update: T): Boolean
}

二.StateFlow的使用

1.MutableStateFlow方法

在协程中,可以通过调用MutableStateFlow方法创建一个MutableStateFlow接口指向的对象,代码如下:

public fun <T> MutableStateFlow(value: T): MutableStateFlow<T> {
    ...
}

通过MutableStateFlow方法可以创建一个类型为MutableStateFlow的对象,需要提供一个参数value,作为初始值。

在并发场景下调用emit方法时,会使StateFlow的数据快速更新,对于处理数据慢的订阅者,将会跳过这些快速更新的数据,但当订阅者需要处理数据时,获取的一定是最新更新的数据。

2.使用示例

代码如下:

private suspend fun test() {
    // 创建一个热流,初始值为1
    val flow = MutableStateFlow(1)
    // 将MutableStateFlow对象转换为StateFlow对象
    // StateFlow对象不能调用emit方法,因此只能用于接收
    val onlyReadFlow = flow.asStateFlow()
    // 接收者1
    // 启动一个新的协程
    GlobalScope.launch {
        // 触发并处理接收的数据
        onlyReadFlow.collect {
            Log.d("liduozuishuai", "test1: $it")
        }
    }
    // 接收者2
    // 启动一个新协程
    GlobalScope.launch {
        // 订阅监听,当collect方法触发订阅时,会首先会调onSubscription方法
        onlyReadFlow.onSubscription {
            Log.d("liduozuishuai", "test2: ")
            // 发射数据:2
            // 向下游发射数据:2,其他接收者收不到
            emit(2)
        }.onEach {
            // 处理接收的数据
            Log.d("liduozuishuai", "test2: $it")
        }.collect()
    }
    // 发送数据:3,多次发送
    GlobalScope.launch {
        flow.emit(3)
        flow.emit(3)
        flow.compareAndSet(3, 3)
    }
}

对于上面的示例,接收者1会依次打印出:1、3,接收者2会依次打印出2、3。接收者2由于在处理onSubscription方法发射的数据2时,MutableStateFlow对象内部的数据1变成了数据3,因此在处理完数据2后,直接处理数据3。

到此这篇关于Kotlin StateFlow单数据更新热流设计与使用介绍的文章就介绍到这了,更多相关Kotlin StateFlow内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-移动开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯