写点什么

[正确] 的使用 Kotlin Flow 进行搜索优化,移动端开发技术路线

用户头像
Android架构
关注
发布于: 42 分钟前

println("----------------->>> $it")


}


}


复制代码


那么我们理想中的正确代码逻辑是这样的:


flow<Int> {


for (i in 0..100) {


// 模拟生成数据


emit(i)


}


}.debounce(500) // 这里是有效的 限流


.collect {


println("----------------->>> $it")


}


复制代码


好了,同学们可以再对比以上两段代码,for循环就是我们模拟的输入数据,这个for循环在里面和在外面是两个完全不一样的逻辑~不再多做解释了


[](


)正确的用法



[](

)你以为的正确写法


对于输入框的这类业务逻辑,单纯使用flow是无法到达目的的,因为写不出来。有的小朋友要站起来高喊了,“怎么写不出来,你瞎说,我来写”,一顿操作写出了下面的代码:


// 小朋友写的错误代码??


flow<Editable> {


editText.doAfterTextChanged { text ->


emit(text) // 这里是错误的,emit 不可以写在内部类中


}


}.debounce(500)


.collect {


println("----------------->>> $it")


}


复制代码


错误的地方我写上了注释,emit是一个suspend挂起函数,是不可以写在内部类里的,代码直接编译不通过。

[](ht

《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


tps://blog.csdn.net/Android578/article/details/113678329)真正的正确写法


首先我提一个知识点,大家回忆一下。RxJava中的流,是分为冷流热流(即:cold Observable 和 hot Observable)对吧。如果你说啥,流还分冷热?亲,那这里建议你炒个回锅肉呢。


RxJava的使用中,不注意区分冷热流,是导致RxJava错用、滥用的原因之一!


这里我只用两句话简单解释冷热流,不展开讲RxJava


  • 冷流:只有观察者进行订阅了,上游才开始执行发射数据

  • 热流:无论有没有观察者,上游的数据都会发射

[](

)flow 是冷流


直接用注释说明:


flow {


// 发射数据


}.collect {


/*


只有执行了 collect 或者 collectLast 订阅了流,


上游 flow 里面的代码块才会执行!


*/


}


复制代码


现在这位小朋友,冷静一下,想想输入框的业务场景是什么样子的?即:不管有没有订阅者,只要EditText文本变化了,都会发送数据。那我们就应该用热流来解决问题。

[](

)StateFlow 热流登场


各位大佬直接看代码吧:


// 定义一个全局的 StateFlow


private val _etState = MutableStateFlow("")


override fun onCreate(savedInstanceState: Bundle?) {


et.doAfterTextChanged { text ->


// 往流里写数据


_etState.value = (text ?: "").toString()


}


lifecycleScope.launch {


_etState


.sample(500) // 限流,500 毫秒


.filter {


// 空文本过滤掉


it.isNotBlank()


}.collect {


// 订阅数据

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
[正确]的使用Kotlin Flow进行搜索优化,移动端开发技术路线