flow 使用汇总

15 阅读1分钟

tryEmit 发送不成功

使用 shareflow 时,在有 collector 前提下,使用 tryEmit 时有时候会返回 false。如下代码 tryEmit 会一直返回 false

    private val flow = MutableSharedFlow<Long>()

        lifecycleScope.launch {
            flow.collect {
                Log.e(TAG, "onCreate: $it")
            }
        }
        findViewById<View>(R.id.text).setOnClickListener {
            val ans = flow.tryEmit(System.currentTimeMillis())
            Log.e(TAG, "onCreate: $ans")
        }

tryEmit() 主要用于尝试 emit 数据,当发现需要阻塞生产者时就会返回 false。对于默认的 shareflow,其缓冲区大小为 0,所以缓冲区永远都是满的,自然就不可能 emit 成功数据,所以 tryEmit 就会返回 false

combine 收不到数据

shareflow 没有默认值,而 combine 必须等所有 flow 都有值后才会往下游发送数据。因此,combine shareflow 时,只要 shareflow 没有数据,下游就永远不会收到数据 —— 等 shareflow 的数据。