-基础讲解)
一.简介在协程中与仅返回单个值的挂起函数相反数据流可按顺序发出多个值。例如您可以使用数据流从数据库接收实时更新。数据流以协程为基础构建可提供多个值。从概念上来讲数据流是可通过异步方式进行计算处理的一组数据序列。所发出值的类型必须相同。例如FlowInt是发出整数值的数据流。数据流包含三个实体提供方会生成添加到数据流中的数据。得益于协程数据流还可以异步生成数据。可选中介可以修改发送到数据流的值或修正数据流本身。使用方则使用数据流中的值。官网讲解Android 上的 Kotlin 数据流 | Android Developers二.创建数据流1.flow构建器函数会创建一个新数据流fun T flow(block: suspend FlowCollectorT.() - Unit): FlowT2.emit方法发送数据流abstract suspend fun emit(value: T)三.修改数据流可以利用中间运算符map在不使用值的情况下修改数据流。这些运算符都是函数可在应用于数据流时设置一系列暂不执行的链式运算留待将来使用值时执行。inline fun T, R FlowT.map(crossinline transform: suspend (value: T) - R): FlowR四.行收集数据流使用Collect可以收集数据流abstract suspend fun collect(collector: FlowCollectorT) myFlow.collect { value - println(Collected $value) }五.举例说明1.代码class KotlinFlowActivity1 : ComponentActivity() { private val scope MainScope() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_flow1) val myFlow flow { emit(2) } scope.launch(Dispatchers.Main) { myFlow.map { it * it } .collect { Log.d(数据流, 2的平方$it) } } } override fun onDestroy() { super.onDestroy() scope.cancel() } }2.结果数据流 com.example.newdemo D 2的平方43.说明3.1.map不是终止操作必须结合collect使用。3.2.map 里的 transform 默认运行在收集端协程的上下文collectors context。如果要做耗时计算建议用 flowOn 指定上游上下文。