Kotlin管道Channel在receiveAsFlow时debounce与flow差异

Kotlin管道Channel在receiveAsFlow时debounce与flow差异

Kotlin 复制代码
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking

const val timeOut = Long.MAX_VALUE
//val delayTimes = arrayListOf(50L, 100L, 150L, 200L, 250L)

fun main(args: Array<String>) {
    val channel = Channel<String>()

    runBlocking {
        launch(Dispatchers.IO) {
            repeat(5) {
                println("-")

                val t = System.currentTimeMillis()
                channel.send("$it-$t")

                val d = getDelayTime()
                println("$it channel 休眠 $d")
                delay(d)
            }
        }

        launch(Dispatchers.IO) {
            flow {
                repeat(5) {
                    println("--")

                    val t = System.currentTimeMillis()
                    emit("$it-$t")

                    val d = getDelayTime()
                    println("$it flow 休眠 $d")
                    delay(d)
                }
            }.debounce(timeOut) //这里的timeOut值很大,flow的collect收到。
                .collect {
                    println("flow $it")
                }
        }

        channel.receiveAsFlow()
            .debounce(timeOut) //这里的timeOut值很大,collect收不到。
            .collect {
                println("debounce $it")
            } //一直阻塞接收消息
    }

    //阻塞,其实走不到这里。
    channel.close()
}

fun getDelayTime(): Long {
    return 10
}

--

0 channel 休眠 10

0 flow 休眠 10

--

1 flow 休眠 10

1 channel 休眠 10

--

2 channel 休眠 10

2 flow 休眠 10

--

3 channel 休眠 10

3 flow 休眠 10

--

4 channel 休眠 10

4 flow 休眠 10

flow 4-1693561918986

程序运行后,flow很快就收到了最后一条数据4-xxx...,而Channel在receiveAsFlow接收数据debounce时候,将会一直等待下去。这种纯flow和Channel的receiveAsFlow之间的差异要注意。

Kotlin协程flow的debounce与管道Channel_zhangphil的博客-CSDN博客kotlin协程管道Channel。debounce蕴含了一定的缓冲思想,即,不立刻触发事件,而是先把要发射的数据进入队列,稍等一定时间(时间)延迟触发,而触发的重要条件取决于前一条数据和后一条数据的时间间隔,注意,前一条和后一条尚未被发射出去,只是待命中。发射完ABC,Kotlin审视待发射的ABCD,按理说ABCD与ABC间隔200,满足发射timeOut值,但是ABCD与ABCDE间隔100,所以跳过ABCD,直接发射ABCDE。A和AB都待发射,A和AB间隔100,所以跳过A,直接发射AB。https://blog.csdn.net/zhangphil/article/details/132525124

Kotlin协程flow的debounce参数timeoutMillis特性_zhangphil的博客-CSDN博客debounce蕴含了一定的缓冲思想,即,不立刻触发事件,而是先把要发射的数据进入队列,稍等一定时间(时间)延迟触发,而触发的重要条件取决于前一条数据和后一条数据的时间间隔,注意,前一条和后一条尚未被发射出去,只是待命中。发射完ABC,Kotlin审视待发射的ABCD,按理说ABCD与ABC间隔200,满足发射timeOut值,但是ABCD与ABCDE间隔100,所以跳过ABCD,直接发射ABCDE。四、map,重组改写数据。A和AB都待发射,A和AB间隔100,所以跳过A,直接发射AB。https://blog.csdn.net/zhangphil/article/details/132525869

Kotlin协程flow发送时间间隔debounce_zhangphil的博客-CSDN博客debounce蕴含了一定的缓冲思想,即,不立刻触发事件,而是先把要发射的数据进入队列,稍等一定时间(时间)延迟触发,而触发的重要条件取决于前一条数据和后一条数据的时间间隔,注意,前一条和后一条尚未被发射出去,只是待命中。发射完ABC,Kotlin审视待发射的ABCD,按理说ABCD与ABC间隔200,满足发射timeOut值,但是ABCD与ABCDE间隔100,所以跳过ABCD,直接发射ABCDE。四、map,重组改写数据。A和AB都待发射,A和AB间隔100,所以跳过A,直接发射AB。https://blog.csdn.net/zhangphil/article/details/132515686

相关推荐
博.闻广见24 分钟前
15-Compose开发-重组机制
kotlin·composer
向上_503582914 小时前
配置Protobuf输出Java文件或kotlin文件
android·java·开发语言·kotlin
我命由我1234521 小时前
Android Gradle - Gradle 自定义插件(Build Script 自定义插件、buildSrc 自定义插件、独立项目自定义插件)
android·java·java-ee·kotlin·android studio·android-studio·android runtime
滑雪的企鹅.1 天前
Kotlin云头条技术点剖析(项目复习02)——用户协议页面
android·开发语言·kotlin
sinat_267611911 天前
Trae AI 进行 Android 从0 到 1的一键开发
kotlin·android studio·trae
进击的cc1 天前
Android Kotlin:高阶函数与Lambda简化回调地狱
android·kotlin
向上_503582911 天前
两个moudle访问一个lib包
android·java·kotlin
幸福在路上wellbeing1 天前
Kotlin 核心学习大纲(Android 开发)
android·学习·kotlin
alexhilton2 天前
Jetpack Compose中的富文本输入
android·kotlin·android jetpack
进击的cc2 天前
Android Kotlin:扩展函数如何优雅封装Android API
android·kotlin