Kotlin Flow&SharedFlow&StateFlow
Flow
- Flow 是冷流,只有调用 collect() 后才会触发数据生产逻辑。
- 无始化值。
- 每个收集者独立处理数据流。
- 支持背压操作。
val flow = flow {
emit("hello")
delay(2000L)
emit("world")
}
flow.collect {
Log.e("TAG", "collector1: $it")
}
flow.collect {
Log.e("TAG", "collector2: $it")
}
// collector1: hello
// collector1: world
// collector2: hello
// collector2: world
SharedFlow
- SharedFlow 是热流,没有收集者也会执行数据生成逻辑。
- 无初始值。
- 支持多个收集者共享数据。
- 支持配置历史值,通过 replay 参数。
SharedFlow构造函数
public fun <T> MutableSharedFlow(
replay: Int = 0,
extraBufferCapacity: Int = 0,
onBufferOverflow: BufferOverflow = BufferOverflow.SUSPEND //
):
- replay:缓存历史数据个数,为0表示不缓存历史数据。
- extraBufferCapacity:减去replay后的缓冲空间。缓冲器总容量=replay+extraBufferCapacity。
- onBufferOverflow:缓冲区满时的策略,默认为挂起。
MainActivity:
class MainActivity : AppCompatActivity() {
private val viewModel: MainViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
lifecycleScope.launch {
viewModel.flow.collect {
Log.e("TAG", "collector1: $it")
}
}
lifecycleScope.launch {
viewModel.flow.collect {
Log.e("TAG", "collector2: $it")
}
}
}
fun onClick(view: View) {
viewModel.send()
}
}
MainViewModel:
class MainViewModel : ViewModel() {
private val _flow = MutableSharedFlow<String>(replay = 1)
val flow = _flow.asSharedFlow()
fun send() {
viewModelScope.launch {
_flow.emit("hello")
_flow.emit("world")
}
}
}
replay
class MainViewModel : ViewModel() {
private val _flow = MutableSharedFlow<String>(1 )
val flow = _flow.asSharedFlow()
fun send() {
viewModelScope.launch {
_flow.tryEmit("hello")
_flow.tryEmit("world")
}
}
}
// collector1: hello
// collector2: hello
说明:当 replay 设置为 1 时,点击 send(),订阅者会收到1条数据。
class MainViewModel : ViewModel() {
private val _flow = MutableSharedFlow<String>(1 )
val flow = _flow.asSharedFlow()
fun send() {
viewModelScope.launch {
_flow.tryEmit("hello")
_flow.tryEmit("world")
}
}
}
// collector1: hello
// collector1: world
// collector2: hello
// collector2: world
说明:当 replay 设置为 2时,点击 send(),订阅者会收到2条数据。
StateFlow
- StateFlow 是热流,没有收集者也会执行数据生成逻辑。
- 必须设置初始值。
- 自动去重,通过 equals() 方法判断新值与旧值是否相同,不同则触发更新。
- 简化的 SharedFlow,等价于
replay=1
且onBufferOverflow=DROP_OLDEST
的SharedFlow
。
MainActivity:
class MainActivity : AppCompatActivity() {
private val viewModel: MainViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
lifecycleScope.launch {
viewModel.flow.collect {
Log.e("TAG", "collector1: $it")
}
}
lifecycleScope.launch {
viewModel.flow.collect {
Log.e("TAG", "collector2: $it")
}
}
}
fun onClick(view: View) {
viewModel.send()
}
}
// collector1: world
// collector2: world
MainViewModel:
class MainViewModel : ViewModel() {
private val _flow = MutableStateFlow("")
val flow = _flow.asStateFlow()
fun send() {
viewModelScope.launch {
_flow.value = "hello"
_flow.value = "world"
}
}
}
说明:点击 send() 方法,订阅者收到1条数据。
总结
Flow | SharedFlow | StateFlow | |
---|---|---|---|
特征 | 冷流 | 热流 | 热流 |
初始值 | 无 | 无 | 有 |
数据共享 | 独立处理数据流 | 共享数据流 | 共享数据流 |
重播数据 | 不支持 | 配置replay | 仅保留最新值 |
场景 | 单次异步操作,如:网络请求 | 数据共享,如:全局通知 | UI状态管理 |