Android kotlin学习之flow(一)

Flow是Kotlin协程中的一个概念,用于处理异步数据流,使代码更简洁易读。通过collect收集数据,使用map、filter等函数处理数据。在Android中,LifecycleScope用于生命周期管理,repeatOnLifecycle确保在合适的状态执行协程,flowOn指定执行环境。示例代码展示了如何创建和使用Flow。
摘要由CSDN通过智能技术生成

先看效果:

一.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的作用是启动一个协程,并在其中执行一些操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值