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

相关推荐
aqi003 小时前
FFmpeg开发笔记(九十八)基于FFmpeg的跨平台图形用户界面LosslessCut
android·ffmpeg·kotlin·音视频·直播·流媒体
冬奇Lab5 小时前
【Kotlin系列01】Kotlin快速入门:环境搭建与Hello World
android·kotlin·android studio
儿歌八万首1 天前
Jetpack Compose 动画实战:让你的 UI 动起来
android·kotlin·动画·compose
stevenzqzq1 天前
Android Koin 注入入门教程
android·kotlin
zFox1 天前
三、Kotlin协程+异步加载+Loading状态
kotlin·android jetpack·协程
shuangrenlong1 天前
笔记kotlin注意的点
kotlin
Android-Flutter1 天前
android compose LazyVerticalGrid上下滚动的网格布局 使用
android·kotlin
Android-Flutter1 天前
android compose LazyHorizontalGrid水平滚动的网格布局 使用
android·kotlin
我命由我123451 天前
Kotlin 面向对象 - 装箱与拆箱
android·java·开发语言·kotlin·android studio·android jetpack·android-studio