「正确」的使用Kotlin Flow进行搜索优化,最新Android笔试题分享

本文深入探讨了在使用Kotlin Flow处理输入框文本变化时常见的编程误区,详细分析了冷流与热流的区别,并提出了使用StateFlow实现热流的正确实践。

binding.tvShow.text = it.toString()

}.flowOn(Dispatchers.Main)

.launchIn(lifecycleScope)

}

仔细看上面的代码,你们自己想想错在了哪里?

文本输入框etSearch每次文本的变化都会回掉searchFilter()方法,而方法里面每次都去实例化了一个flow,然后又使用了debounce()限流,那么这个debounce()限流的意义何在?毫无意义啊,对吧。因为每次都是新创建的flow啊。

还不懂的话,那就看下面简化的代码:

// 文章错误代码的简化

for (i in 0…100) {

// 模拟生成数据

flow {

emit(i)

}.debounce(500) // 这里是无效的 限流,因为 flow 的 emit 只执行了一次啊……

.collect {

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

}

}

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

flow {

for (i in 0…100) {

// 模拟生成数据

emit(i)

}

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

.collect {

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

}

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

正确的用法

=====

你以为的正确写法

========

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

// 小朋友写的错误代码

flow {

editText.doAfterTextChanged { text ->

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

}

}.debounce(500)

.collect {

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

}

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

真正的正确写法

=======

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

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

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

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

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

flow是冷流

=======

直接用注释说明:

flow {

// 发射数据

}.collect {

/*

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

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

*/

}

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

StateFlow热流登场

=============

各位大佬直接看代码吧:

collectLast 订阅了流,

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

*/

}

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

StateFlow热流登场

=============

各位大佬直接看代码吧:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值