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

相关推荐
alexhilton9 小时前
面向开发者的系统设计:像建筑师一样思考
android·kotlin·android jetpack
用户0921 小时前
Gradle Cache Entries 深度探索
android·java·kotlin
叽哥1 天前
Kotlin学习第 9 课:Kotlin 实战应用:从案例到项目
android·java·kotlin
叽哥2 天前
Kotlin学习第 8 课:Kotlin 进阶特性:简化代码与提升效率
android·java·kotlin
Kapaseker2 天前
每个Kotlin开发者应该掌握的最佳实践,第一趴
kotlin
丑小鸭是白天鹅2 天前
Kotlin协程详细笔记之切线程和挂起函数
开发语言·笔记·kotlin
程序员江同学2 天前
ovCompose + AI 开发跨三端的 Now in Kotlin App
android·kotlin·harmonyos
charlie1145141912 天前
Kotlin 的 apply / with / run 详解
开发语言·kotlin·程序设计·面对对象
柿蒂3 天前
从if-else和switch,聊聊“八股“的作用
android·java·kotlin
叽哥3 天前
Kotlin学习第 7 课:Kotlin 空安全:解决空指针问题的核心机制
android·java·kotlin