我先把那篇文章中错误的代码贴上来:
// 错误代码🙅
binding.etSearch.doOnTextChanged { text, _, _, _ ->
searchFilter(text.toString())
}
private fun searchFilter(str:String){
flow { emit(str) }
.debounce(400)
.filter {
it.isNotEmpty()
}
.catch { LogUtils.d(it.message) }
.flowOn(Dispatchers.Default)
.onEach {
LogUtils.d(“输出:$it”)
binding.tvShow.text = it.toString()
}.flowOn(Dispatchers.Main)
.launchIn(lifecycleScope)
}
复制代码
仔细看上面的代码,你们自己想想错在了哪里?
文本输入框etSearch
每次文本的变化都会回掉searchFilter()
方法,而方法里面每次都去实例化了一个flow
,然后又使用了debounce()
限流,那么这个debounce()
限流的意义何在?毫无意义啊,对吧。因为每次都是新创建的flow
啊。
还不懂的话,那就看下面简化的代码: