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 的数据。