Kotlin协程中的Flow,android开发文档中文版

这篇博客详细介绍了Kotlin Flow在Android开发中的应用,通过实例展示了如何使用`.filter`、`.map`、`.transform`、`.buffer`、`.conflate`和`.zip`等操作符进行数据处理和控制流管理。内容涵盖了从简单的数据过滤、转换到复杂的背压控制和流合并,帮助开发者深入理解Flow的用法。
摘要由CSDN通过智能技术生成

Log.e(TAG, “onStart:${Thread.currentThread()}”)

showToast(“开始”)

}

.onCompletion {

Log.e(TAG, “onCompletion:${Thread.currentThread()}”)

showToast(“结束”)

}

.catch {

Log.e(TAG, “catch:${Thread.currentThread()}”)

showToast(“异常”)

}

.collect {

Log.e(TAG, “collect:${Thread.currentThread()}”)

Log.e(TAG, “collect:${it}”)

mBinding.textView.text = it.toString()

}

}

job.cancel()

filter :过滤操作符

lifecycleScope.launch {

//TODO List 转成 Flow

mList.asFlow()

.onEach {

delay(2000)

Log.e(TAG, “onEach: $it”)

}

.filter {

//TODO 数据过滤操作符

//只发送能被2整除的数据

Log.e(TAG, “filter: $it”)

it.toInt() % 2 == 0

}

.collect {

Log.e(TAG, “collect: $it”)

mBinding.textView.text = it

}

}

filterNot :过滤操作符

lifecycleScope.launch {

//TODO List 转成 Flow

mList.asFlow()

.onEach {

delay(2000)

Log.e(TAG, “onEach: $it”)

}

.filterNot {

//TODO 数据过滤操作符

//只发送不能被2整除的数据

Log.e(TAG, “filterNot: $it”)

it.toInt() % 2 == 0

}

.collect {

Log.e(TAG, “collect: $it”)

mBinding.textView.text = it

}

}

transform:转换操作符(需主动发送数据)

lifecycleScope.launch {

//TODO List 转成 Flow

// mList.asFlow()

flow {

//TODO 上游发射数据

Log.e(TAG, “emit1: start”)

emit(“1”)

Log.e(TAG, “emit2: start”)

emit(“2”)

Log.e(TAG, “emit3: start”)

emit(“3”)

Log.e(TAG, “emit: all end”)

}

.onEach {

delay(2000)

Log.e(TAG, “onEach: $it”)

}

.transform<String, Int> {

//TODO 转化操作符 转化完成后需主动发送数据

Log.e(TAG, “transform: $it”)

val value = it.toInt() + 100

emit(value)

}

.collect {

Log.e(TAG, “collect: $it”)

mBinding.textView.text = it.toString()

}

}

map:转换操作符

lifecycleScope.launch {

//TODO List 转成 Flow

mList.asFlow()

.onEach {

delay(2000)

Log.e(TAG, “onEach: $it”)

}

.map {

//TODO 数据类型转换操作 内部实现transform

Log.e(TAG, “map: $it”)

it.toInt() + 100

}

.collect {

Log.e(TAG, “collect: $it”)

mBinding.textView.text = it.toString()

}

}

take: 截取操作符

lifecycleScope.launch {

//TODO List 转成 Flow

mList.asFlow()

.onEach {

delay(2000)

Log.e(TAG, “onEach: $it”)

}

//TODO 截取操作符,截取N位发射数据

.take(2)

.collect {

Log.e(TAG, “collect: $it”)

mBinding.textView.text = it.toString()

}

}

buffer:背压操作符

lifecycleScope.launch {

//TODO List 转成 Flow

flow {

//TODO 上游发射数据

Log.e(TAG, “emit1: start”)

emit(1)

Log.e(TAG, “emit2: start”)

emit(2)

Log.e(TAG, “emit3: start”)

emit(3)

Log.e(TAG, “emit: all end”)

}

.onEach {

// delay(2000)

Log.e(TAG, “onEach: $it”)

}

//TODO 背压:.buffer() 先emit all 再collect

// .buffer()

//TODO 背压:.buffer(0) 先emit 1和2 -> collect 1和2 再emit 3 -> collect 3

.buffer(0)

.collect {

Log.e(TAG, “collect: $it”)

mBinding.textView.text = it.toString()

}

}

conflate

lifecycleScope.launch {

//TODO List 转成 Flow

flow {

//TODO 上游发射数据

for(i in 1…30) {

delay(100)

emit(i)

}

}

//TODO 仅保留最新的值,无论上游发射多少数据,下游只会接收最新值

.conflate()

.onEach {

delay(2000)

Log.e(TAG, “onEach: $it”)

}

.collect {

Log.e(TAG, “collect: $it”)

mBinding.textView.text = it.toString()

}

}

zip:流合并操作符

val flowOther = (101…110).asFlow()

lifecycleScope.launch {

//TODO List 转成 Flow

mList.asFlow()

.onEach {

最后

这里附上上述的技术体系图相关的几十套腾讯、头条、阿里、美团等公司2021年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。

相信它会给大家带来很多收获:

img

上述高清技术脑图以及配套的架构技术PDF可以点击我的GitHub免费获取

当程序员容易,当一个优秀的程序员是需要不断学习的,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每个阶段都需要掌握不同的能力。早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人。

  • 无论你现在水平怎么样一定要 持续学习 没有鸡汤,别人看起来的毫不费力,其实费了很大力,这四个字就是我的建议!!!
  • 我希望每一个努力生活的IT工程师,都会得到自己想要的,因为我们很辛苦,我们应得的。

当我们在抱怨环境,抱怨怀才不遇的时候,没有别的原因,一定是你做的还不够好!

thub.com/a120464/Android-P7/blob/master/Android%E5%BC%80%E5%8F%91%E4%B8%8D%E4%BC%9A%E8%BF%99%E4%BA%9B%EF%BC%9F%E5%A6%82%E4%BD%95%E9%9D%A2%E8%AF%95%E6%8B%BF%E9%AB%98%E8%96%AA%EF%BC%81.md)

当程序员容易,当一个优秀的程序员是需要不断学习的,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每个阶段都需要掌握不同的能力。早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人。

  • 无论你现在水平怎么样一定要 持续学习 没有鸡汤,别人看起来的毫不费力,其实费了很大力,这四个字就是我的建议!!!
  • 我希望每一个努力生活的IT工程师,都会得到自己想要的,因为我们很辛苦,我们应得的。

当我们在抱怨环境,抱怨怀才不遇的时候,没有别的原因,一定是你做的还不够好!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值