注意collect函数
不要这么做
private val flow1 = MutableStateFlow(0)
fun config() {
textView.setOnClickListener {
flow1.tryEmit(flow1.value + 1)
lifecycleScope.launch {
flow1.collect {
println(it)
}
}
}
}
这种代码乍一看好像没什么问题,但是,这其实是创建了一个线程,这个线程一直在收集着这个flow,每次点击都创建了一个flow的观察者,等待flow值更新,这些线程都会回调这个collect方法,导致点击了几次,就会打印几次这个值。
正确方法
private var collectJob: Job? = null
private val flow1 = MutableStateFlow(0)
fun config() {
textView.setOnClickListener {
flow1.tryEmit(flow1.value + 1)
collectJob?.cancel()
collectJob = lifecycleScope.launch {
flow1.collect {
println(it)
}
}
}
}
或者在收集前,用flow的take操作符,设定收集几次。