介绍:Flow是google官方提供的一套基于kotlin协程的数据流处理模型,类似RxJava。另外Flow作用在协程内,可以与协程的生命周期绑定,当协程取消时,Flow也会被取消,避免了内存泄漏风险,这点又类似LiveData。因此Flow可以用来替代LiveData和RxJava。
LiveData不支持线程切换,数据更新都是在主线程完成,对于频繁切换线程处理比较麻烦。
RxRava *** 作符较多,入门门槛较高,另外未关联生命周期,需要自己处理取消订阅。
使用:
1、创建flow
//方式1
val flowOne = flow {
for (i in 1..5) {
emit(i)
}
}
//方式2
val flowTwo = flowOf(1..5)
//方式3
val flowThree = (1..5).asFlow()
//方式4
val flowFour = channelFlow {
for (i in 1..5) {
send(i)
}
}
注:方式2、3指定了数据类型,而方式1、4为指定类型可以发送不同类型的数据。
2、执行flow
CoroutineScope(Dispatchers.Main).launch {
flow {
for (i in 1..2) {
Log.e("aa", "emit $i start")
delay(2000)
emit(i)
Log.e("aa", "emit $i end")
}
emit("巴拉巴拉!")
}.onStart {
Log.e("aa", "onStart")
}.onCompletion {
Log.e("aa", "onCompletion")
}.collect {
//接收数据流
Log.e("aa", "collect $it start")
delay(2000)
Log.e("aa", "collect $it end")
}
}
注:
(1)collect要在协程中调用或者把方法用suspend声明为挂起函数
(2)当调用collect时才执行数据流,每个订阅者都完整的执行flow流
(3)flow和collect交叉执行。flow中执行到emit时跳转到collect中执行,collect执行完又回到flow
3、flowOn *** 作符:指定flow执行环境,不指定默认和collect一致
.flowOn(Dispatchers.IO)
注:
(1)flowOf(requestData()),其中requestData()运行环境与flowOn指定的环境无关,flowOn作用域为flow{}中的代码。
(2)flow{}中不允许通过withContext(Dispatchers.Default) 切换环境需要flowOn方式
4、zip *** 作符:进行两个流的数据压缩
val flowOne = flow {
for (i in 5..10) {
Log.e("aa", "emit $i start")
emit(i)
Log.e("aa", "emit $i end")
}
}
....
.zip(flowOne){t1, t2 ->
"t1=$t1 t2=$t2"
}.collect {
//接收数据流
Log.e("aa", "collect $it start")
delay(2000)
Log.e("aa", "collect $it end")
}
注:
(1)flow和collect并不像上面那样规律的顺序交叉执行
(2)两个flow中emit的数量不同时,依据最小的执行完为止
5、冷流vs热流(以上创建方式均为冷流,下面介绍热流)
冷流:当订阅时才执行,且每次订阅上游都会完整的执行数据流,相当于每个订阅的事件都是独立的
热流:不管是否被订阅,上游发布都会执行数据流,多个订阅者都能收到相同的消息,相当于将处理结果广播给所有订阅者。
6、SharedFlow
7、StateFlow
参考:
“再见RxJava,你好Flow”,Android线程切换哪家最强?
Android Kotlin之Flow数据流
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)