当前位置: 首页 > news >正文

Kotlin协程flow发送时间间隔debounce

Kotlin协程flow发送时间间隔debounce

debounce的作用是让连续发射的数据之间间隔起来。典型的应用场景是搜索引擎里面的关键词输入,当用户输入字符时候,有时候,并不希望用户每输入任何一个单字就触发一次后台真正的查询,而是希望用户在输入一定时间间隔后(猜测此时用户已完成完整关键词的输入),才真正发送最后一次的输入。debounce蕴含了一定的缓冲思想,即,不立刻触发事件,而是先把要发射的数据进入队列,稍等一定时间(时间)延迟触发,而触发的重要条件取决于前一条数据和后一条数据的时间间隔,注意,前一条和后一条尚未被发射出去,只是待命中。如果连续两次间隔时间满足timeOut,只保留最后一条数据。

 

import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.runBlockingfun main(args: Array<String>) {val timeOut = 100LrunBlocking {val result = userInput().debounce(timeOut).collect {println(it)}}
}fun userInput() = flow {emit("A")delay(100)emit("AB")delay(150)emit("ABC")delay(200)emit("ABCD")delay(100)emit("ABCDE")
}

 

当timeOut=100

AB
ABC
ABCD
ABCDE

A和AB都待发射,A和AB间隔100,所以跳过A,直接发射AB。

发射完AB后,由于ABC与之前的AB间隔超过100,继续发射。

 

 

 

 

当timeOut=150,比较难理解。

AB
ABC
ABCDE

A待发射,Kotlin发现A与AB间隔才100,所以舍弃A,Kotlin发现从A开始到AB之后的ABC,AB的等待时间超过150,且之前的A没有发射,所以发射AB。

发射完AB,下一个ABC与AB之间间隔150,且ABC与其后仍有时间间隔,继续发射ABC。

发射完ABC,Kotlin审视待发射的ABCD,按理说ABCD与ABC间隔200,满足发射timeOut值,但是ABCD与ABCDE间隔100,所以跳过ABCD,直接发射ABCDE。这里特别注意,Kotlin发射当前数据时候,是要把这条数据的前一条、后一条都拉通看的。

 

 

 

当timeOut=200

ABC
ABCDE

A与AB间隔100,舍弃A。而AB与之前的A间隔100,与之后的ABC间隔150,小于timeOut值,舍弃。ABC与之前的AB有时间间隔,与之后的ABCD间隔刚好等于timeOut值,所以发射。

 

 

 

当timeOut=250

ABCDE

 

简单的说,Kotlin用debounce发射当前数据时候,这个数据的前一条数据和后一条数据必须满足时间间隔才能发射,否则舍弃。

 

Kotlin协程flow,firstOrNull只要最先first,lastOrNull只要最后_zhangphil的博客-CSDN博客firstOrNull() //虽然发射很多数据,但只要第1次发射过来的数据。.lastOrNull() //虽然发射很多数据,但只要最后1次发射过来的数据。emit(i)delay(10)kotlin协程flow任务意外结束未emit数据retryWhen onEmpty(5)_zhangphil的博客-CSDN博客一、flow ,emit,onCompletion,collect。https://blog.csdn.net/zhangphil/article/details/132492588kotlin协程flow filter map flowOn zip combine(1)_zhangphil的博客-CSDN博客一、flow ,emit,onCompletion,collect。四、map,重组改写数据。八、conflate 合并。九、debounce去重。二、函数作为flow。https://blog.csdn.net/zhangphil/article/details/130084723

 

http://www.lryc.cn/news/140768.html

相关文章:

  • ServiceManager接收APP的跨进程Binder通信流程分析
  • Git问题:解决“ssh:connect to host github.com port 22: Connection timed out”
  • 在Eclipse中创建javaweb工程
  • Pycharm链接远程mysql报错
  • 【硕士论文完美复现】【价格型需求响应】基于需求侧响应的配电网供电能力综合评估(Matlab代码实现)
  • Android Okhttp 源码浅析三
  • 一分钟学会用pygame制作棋盘背景
  • Java --- 包装类
  • [运维] wvp 28181安装部署全流程(ubuntu2204)
  • vue实现富文本
  • uniapp 开发微信小程序使用echart的dataZoom属性缩放功能不生效!bug记录!
  • 用户端Web自动化测试_L4
  • CAPL - Panel和TestModule结合实现测试项可选
  • 机器学习,过拟合与欠拟合,正则化与交叉验证
  • gradio使用transformer模块demo介绍1:Text Natural Language Processing
  • 算法通关村——数论经典问题解析
  • 代码随想录算法训练营第四十六天|LeetCode 1143,1035,53
  • leetcode 541.反转字符串II
  • MyBatis与Spring整合以及AOP和PageHelper分页插件整合
  • 《认知觉醒》读书笔记之潜意识
  • Stable Diffusion 系列教程 | 图生图基础
  • cuda编程day001
  • Java 中使用 ES 高级客户端库 RestHighLevelClient 清理百万级规模历史数据
  • C++最易读手撸神经网络两隐藏层(任意Nodes每层)梯度下降230821a
  • Leetcode 2235.两整数相加
  • Postman —— postman实现参数化
  • LeetCode--HOT100题(41)
  • 微信小程序教学系列(6)
  • 小程序中的全局配置以及常用的配置项(window,tabBar)
  • 数据工厂调研及结果展示