注意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操作符,设定收集几次。

更多推荐