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 用于您希望每个订阅者从一开始就收到每个值的东西。
我知道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 用于您希望每个订阅者从一开始就收到每个值的东西。