先看效果:
一.Flow的基本概念与原理
Flow是Kotlin协程的扩展,底层代码是基于Kotlin协程实现的,它是一种称为“异步流”的数据结构来处理数据,可以让我们像运行同步代码一样运行异步代码,使得代码更加简洁,提高了代码的可读性。Flow的基本使用方式是通过调用collect函数来收集数据。
在Flow中,我们可以使用collect函数来收集数据。这个函数会创建一个协程,并将数据传递给该协程。当协程完成时,collect函数会返回一个结果。
Flow还提供了一些其他的函数,例如map、filter和flatMap等,这些函数也会创建协程并将数据传递给它们。这些函数会根据不同的条件对数据进行处理,并返回一个新的Flow对象。
二.使用方法
简单来说:通过emit发射数据,通过collect收集数据。
三.代码实例
private lateinit var mFlow: Flow<String>//定义了一个私有的、延迟初始化的Flow类型的变量mSimpleFlow。
private fun initFlow() {
var sendNum = 0
Log.d("测试", "initFlow")
lifecycleScope.launch{
lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED){//在发送数据流时,使用lifecycle.repeatOnLifecycle方法来监听生命周期事件,当应用程序处于STARTED状态时,重复执行以下操作
launch {
//flow本身是冷流
mFlow = flow {
sendNum++
emit("sendValue:$sendNum")//emit发射数据
}.flowOn(Dispatchers.IO)
.filter { it.isNotEmpty() }
.onEmpty { Log.d("测试", "onEmpty") }
.onStart { Log.d("测试", "onStart") }
.onEach {Log.d("测试", "onEach: $it") }
.onCompletion { Log.d("测试", "onCompletion: $it") }
.catch { exception -> exception.message?.let { Log.d("测试", "message: $it") } }
}
}
}
}
fun initEvents() {
Log.d("测试", "initEvents")
//---------------simpleFlow---------------
button1.setOnClickListener {//button,textview1需要定义且应用于项目。
Log.d("测试", "button1")
lifecycleScope.launch {
mFlow.collect {//collect收集数据
textview1.text = it
button1.text = it
Log.d("测试", "mBtnContent1:${textview1.text}")
}
}
}
button2.setOnClickListener {
Log.d("测试", "button2")
lifecycleScope.launch {
mFlow.collect {//collect收集数据
textview1.text = it
button2.text = it
}
}
}
}
点击按钮后的运行日志结果:
知识点
(1)LifecycleScope是Android Jetpack组件库中的一部分,它是一个协程作用域,用于在Activity、Fragment等生命周期对象的生命周期内运行协程。它的底层原理是通过监听生命周期对象的状态变化来控制协程的执行时机,从而避免了在非UI线程中执行耗时操作的问题。具体来说,LifecycleScope会在Activity或Fragment创建时启动协程,并在Activity或Fragment销毁时取消协程。这样可以确保协程只在UI线程中执行,避免了在非UI线程中执行耗时操作的问题 。
(2)在 Kotlin 中,repeatOnLifecycle 函数是一个协程函数,它可以在指定的生命周期对象(如 Activity、Fragment 等)处于特定状态时重复执行一个协程。
(3)在 Kotlin 中,Flow 的 flowOn 方法用于指定数据流的执行环境。它接受一个协程作用域作为参数,并在该作用域内执行数据流。
(4)launch的作用是启动一个协程,并在其中执行一些操作。