Kotlin中shareIn冷流转热流如何获取数据?

How can I get data when I convet a cold flow to hot flow using shareIn in Kotlin?

我知道Flow很冷,我可以用collect像代码A一样获取每一个数据

如果我像代码B一样使用shareIn将Flow转换为热流,我怎样才能获得热流中的所有数据?

代码A

val simple: Flow<Int> = flow { 
    for (i in 1..3) {
        delay(100) 
        emit(i) 
    }
}


class LatestNewsActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        lifecycleScope.launch {
            repeatOnLifecycle(Lifecycle.State.STARTED) {
               simple.collect{ i- > print(i)}
            }
        }
    }
}

代码B

val hotSimple:  SharedFlow<Int> = flow { 
    for (i in 1..3) {
        delay(100) 
        emit(i) 
    }
}.shareIn(viewModelScope, SharingStarted.WhileSubscribed(5000), replay = 1)


class LatestNewsActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        lifecycleScope.launch {
            repeatOnLifecycle(Lifecycle.State.STARTED) {
               //I want to print every data in hotSimple.
            }
        }
    }
}

保证它的唯一方法是给 shareIn 一个重播值,该值至少与源流将产生的值的数量一样大。在大多数情况下,这不是一个实用的解决方案,因为您并不总是知道上游流将产生多少值,或者它可能是无限的。此外,回放中的每个项目都保存在内存中,因此内存使用可能是一个问题。只有发出的值会被重播,因此对于新订阅者,副作用和延迟不会与发出的值一起重播。

使用 SharedFlow 的全部意义在于它不必为新订阅者重新启动。因此,通常您不会将 SharedFlow 用于您希望每个订阅者从一开始就收到每个值的东西。