kotlin flow

Kotlin协程之flow工作原理 概述 最近想学习一下 Kotlin 中 flow 的用法, Google 上搜了搜发现很多比较 RxJava 和 flow 的文章,其实我在实际业务中从来没有用过 RxJava, 倒不是因为它不好,而是…我一直傻傻不太会用 RxJava 的操作符,看不太懂,又一直没花时间(懒惰)去研究它那些操作符的原理,就一直不怎么敢用。这次看到了 flow, 想着还是先去了解了解它内部几个操作符的原理吧,不然用起来总是不太踏实。 需要注意的是 Flow 需要在协程中使用, 因此配合协程,可以方便地切线程。分析 flow 阅读详情

冷流(flow):

依赖消费者,有消费才能生产; 是同步非阻塞的。 当有数据被订阅时,发布者才执行发射数据流的代码,当有多个订阅者的时候,每一个订阅者和发布者都是一对一的关系;

flow构建器中的代码直到流被收集的时候才运行;

先执行collect后在执行flow构建器中的代码; 

热流(stateFlow):

无论有没有订阅者订阅,事件始终都会发生。当热流有多个订阅者时,发布者跟订阅者是一对多的关系,热流可以与多个订阅者共享信息;

与livedata区别:StateFlow只有在值发生改变时才会返回,如果发生更新但值没有变化时,StateFlow不会回调collect函数,但LiveData会进行回调。

suspendCancellableCoroutine :它允许你在一个协程中创建一个可取消的挂起操作,通常用于实现自定义的挂起函数或处理异步操作

import kotlinx.coroutines.*
import kotlin.coroutines.resume
import kotlin.coroutines.resumeWithException

suspend fun fetchData(): String = suspendCancellableCoroutine { cont ->
    // 模拟异步操作
    Thread {
        try {
            // 假装我们正在做一些网络请求
            Thread.sleep(2000)
            cont.resume("Data fetched successfully")
        } catch (e: Exception) {
            cont.resumeWithException(e)
        }
    }.start()
}

支持取消操作

suspendCancellableCoroutine 的强大之处在于它可以响应取消操作。当协程被取消时,我们可以在回调中处理取消逻辑。

suspend fun fetchDataCancellable(): String = suspendCancellableCoroutine { cont ->
    val thread = Thread {
        try {
            Thread.sleep(2000)
            if (cont.isActive) {
                cont.resume("Data fetched successfully")
            }
        } catch (e: Exception) {
            cont.resumeWithException(e)
        }
    }
    thread.start()
    cont.invokeOnCancellation {
        thread.interrupt()
        println("Fetch data operation was cancelled")
    }
}

实际应用场景

网络请求

在实际开发中,我们经常需要进行网络请求,而网络请求通常是异步的。通过 suspendCancellableCoroutine,我们可以很方便地将网络请求转换为挂起函数,从而简化代码逻辑。

suspend fun makeNetworkRequest(): String = suspendCancellableCoroutine { cont ->
    val call = OkHttpClient().newCall(Request.Builder().url("https://example.com").build())
    cont.invokeOnCancellation { call.cancel() }
    call.enqueue(object : Callback {
        override fun onResponse(call: Call, response: Response) {
            if (cont.isActive) {
                cont.resume(response.body?.string() ?: "")
            }
        }
        override fun onFailure(call: Call, e: IOException) {
            if (cont.isActive) {
                cont.resumeWithException(e)
            }
        }
    })
}
数据库操作

类似地,我们可以将异步的数据库操作转换为挂起函数。

suspend fun queryDatabase(query: String): List<Data> = suspendCancellableCoroutine { cont ->
    val database = Database.getInstance()
    val cursor = database.rawQuery(query, null)
    cont.invokeOnCancellation { cursor.close() }
    // 模拟数据库查询
    Thread {
        try {
            val data = mutableListOf<Data>()
            while (cursor.moveToNext()) {
                data.add(cursorToData(cursor))
            }
            if (cont.isActive) {
                cont.resume(data)
            }
        } catch (e: Exception) {
            cont.resumeWithException(e)
        } finally {
            cursor.close()
        }
    }.start()
}

eg:

kotlin协程Flow的StateFlow和SharedFlow(十二)_mutablestateflow 连续 相同 值-优快云博客

https://juejin.cn/post/7001071604855734285

https://juejin.cn/post/6999970538760192008

https://juejin.cn/post/6999970538760192008

https://juejin.cn/post/7195569817940164668

2023电视专用!安卓电子相册APP避坑指南(附开源代码) 本文针对2023年智能电视用户,提供安卓电子相册APP的避坑指南与实战教程。文章详细解析了电视端相册应用的常见广告与兼容性陷阱,并指导用户如何安全获取、部署纯净的APK应用,通过核心设置实现无广告的个性化图片轮播体验,最终打造专属的家庭回忆墙。 阅读详情

相关推荐

zabbix5+dify+ollama+deepseek+企业微信 本地部署实现故障智能分析

zabbix5告警信息deepseek自动分析

slc14211421的专栏 3070

StateFlow 不更新问题

stateFlow 不更新的情景解析。

FREE_CODER 2285

C#实战:手把手教你用SerialPort实现RS485 ModbusRTU通信(附完整代码)

本文详细介绍了如何使用C#的SerialPort类实现RS485 ModbusRTU通信,包括硬件准备、串口配置、数据收发核心逻辑及高级通信技巧。通过实战案例和完整代码,帮助开发者快速掌握工业级通信框架的构建方法,提升设备间通信的稳定性和效率。

weixin_29207533的博客 254

Kotlin Flow详解

在协程中,与仅返回单个值的挂起函数不同,`flow`可按顺序发出多个值。例如,可以使用`flow`接收来自数据库的实时更新。 `flow`在协程的构建基础上,可以提供多值返回。从概念上来说,`flow`可以通过异步方式处理一组数据序列。前提是所发出的值的类型必须相同。例如,`Flow`是返回整数值数据流。

star_nwe的博客 578

告别双系统!用Ventoy把Ubuntu 22.04装进U盘,打造你的随身开发环境(附保姆级避坑指南)

本文详细介绍了如何使用Ventoy将Ubuntu 22.04安装到U盘,打造便携式开发环境。通过即插即用的特性,开发者可以在任何x86电脑上快速启动完整的Ubuntu系统,无需配置双系统或虚拟机。文章提供了从硬件准备到系统优化的全流程指南,帮助用户高效创建随身开发环境。

weixin_31569671的博客 363

使用同一个时钟源clki,做两个二分频时钟,得到div2_clk1和div2_clk2,这两个时钟都能跟源时钟clki同步,但是div2_clk1和div2_clk2的相位可能是相同的,也可能是反相

比如,触发器1的初始Q为0,而触发器2的初始Q为1(这可能由于芯片制造工艺的微小差异、上电过程的随机性、或没有全局复位信号导致)。这句话的意思是:虽然div2_clk1和div2_clk2都是由同一个妈妈(clki)生出来的,频率也都是妈妈的一半,但它们“起步”的时刻可能不同。所以,上面那段话是在提醒你注意这种潜在的、由分频产生的时钟相位关系的不确定性,这在异步电路设计或时钟管理中是必须考虑的关键因素。结果:div2_clk1和div2_clk2的波形完全重合,它们的上升沿和下降沿都发生在同一时刻。

m0_49540263的博客 591

Kotlin StateFlow、SharedFlow、Channel解析

`StateFlow` 和 `SharedFlow` 是 Flow API,允许数据流以最优方式发出状态更新并向多个使用方发出值。

star_nwe的博客 714

c语言实现求一个矩阵特征值和特征向量

前言 求矩阵的特征值,主要是用的QR分解,在我的有一次博客里,我已经详细地给出了计算的过程,大家有兴趣可以去看下,经过几天的钻研,终于完成了整个的eig算法。下面我将把我的整个代码附上,有不懂的可以问我,欢迎一起讨论学习! 这是对上一次的修改版,上一次写的程序是在C++编译环境下编译的,所以放在c里面编译有些会出错。 最后,如果有不对的地方希望大...

qq_36417014的博客 2万+

王学岗协程(九)————StateFlow

stateFlow是热流,与LiveData 非常相似 先看界面 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" a

qczg_wxg的博客 320

DataEase 未授权+远程代码执行漏洞复现(CVE-2025-49001、CVE-2025-49002)

DataEase 是一款开源的数据分析平台,提供丰富的数据可视化和分析功能,帮助用户轻松地进行数据探索和决策支持。近日,有关DataEase 被爆出多个漏洞,其中 CVE-2025-49001 是由于JWT校验机制错误导致攻击者可伪造JWT令牌绕过身份验证流程,CVE-2025-49002 是由于H2数据库模块没有严格过滤用户输入的JDBC连接参数,可使用大小写绕过补丁。攻击者可利用这些漏洞实现未授权代码执行,威胁用户数据和系统的安全。

李同學AI安全 1947

轨道平面系与轨道姿态系

文章摘要: 轨道平面系与轨道姿态系是航天任务中两个核心坐标系。轨道平面系(惯性系)以地心为原点,Z轴沿轨道角动量方向,用于轨道确定和机动规划;轨道姿态系(如LVLH系)以航天器质心为原点,Z轴指向地心,用于姿态控制和对地观测。两者通过旋转矩阵相互转换:轨道平面系基于轨道根数构建,保持静态;而LVLH系随轨道运动连续旋转。前者适用于全局轨道分析,后者支撑局部任务执行。理解二者的定义差异(原点、基准轴、惯性属性)及数学转换关系,对航天器姿态轨道控制系统的设计与操作至关重要。

ScilogyHunter的博客 85

【Kotlin精简】第9章 Kotlin Flow

Flow是google官方提供的一套基于Kotlin协程的响应式编程模型,它与RxJava的使用类似,但相比之下Flow使用起来更简单,另外Flow作用在协程内,可以与协程的生命周期绑定,当协程取消时,Flow也会被取消,避免了内存泄漏风险。 Flow是Kotlin提供的一个工具,使用协程封装成生产者-消费者模式。 上游来负责生产、中介进行数据加工(可选)、下游来接收消耗。

Yvan 2029

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Android Kotlin之Flow数据流

文章目录Flow介绍Flow使用举例运算符创建操作符中间操作符尾端操作符功能操作符StateFlowStateFlow vs LiveDataSharedFlow完整代码地址参考 Flow介绍 Flow是google官方提供的一套基于kotlin协程的响应式编程模型,它与RxJava的使用类似,但相比之下Flow使用起来更简单,另外Flow作用在协程内,可以与协程的生命周期绑定,当协程取消时,Flow也会被取消,避免了内存泄漏风险。 我们知道 协程是轻量级的线程,本质上协程、线程都是服务于并发场景下,其中协

小马快跑的博客 1万+

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Kotlin 之 Flow

Flow 库是在 Kotlin Coroutines 1.3.2 发布之后新增的库,也叫做异步流,类似 RxJava 的 Observable、Flowable 等等,所以很多人都用 Flow 与 RxJava 做对比。而Flow 则比 RxJava 简单很多。 我们知道 MVVM 中 LiveData 是一个生命周期感知组件,最好在 View 和 ViewModel 层中使用它,如果在 Repositories 或者 DataSource 中使用会有这两个主要的问题:不支持线程切换,其次不支持背压。..

milan-xiao-tiejiang的博客 1005

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Kotlin Flow

Kotlin Flow 一:Flow的概念 Flow流的概念感觉类似于Java的响应式编程,下面看两段代码: // flow的上游 override suspend fun getCompanyListings( fetchFromRemote: Boolean, query: String ): Flow<Resource<List<C...

sometime here 1275

Android上的Kotlin Flow快速指南

重点 (Top highlight)RxJava has been around for a few years now and has been one of the main building blocks for many Android projects to date. Kotlin’s Flow is taking a serious shot at contending for t...

weixin_26727575的博客 2367

Kotlin Flow(一)基本使用

Kotlin协程中使用挂起函数(Suspend函数)可以异步地返回单个计算结果,但是如果有多个计算结果希望通过协程的方式异步返回,这时可以使用Flows(基于kotlin v. 1.3.61)。 返回多个值的方式 使用Collections 一般我们可以使用集合类存储多个值,例如​foo()​返回一个list,包含3各成员,可以通过foreach对其遍历并打印结果 fun foo(): ...

移动端开发干货分享 1万+

Kotlin协程:Flow 异步流

Kotlin协程异步流 Flow

七夜聖君的博客 2600

kotlin flow 使用

kotlin flow学习

weixin_39170886的博客 887

Kotlin:Flow 全面详细指南,附带源码解析。

Flow 来了来了它终于来了,这篇本应在好几个个月前就需要发布的文章????。一拖再拖????,毕竟对于flow还是的有敬畏之心的,不好好研究一下真心不敢乱写,有什么问题,欢迎指出,欢迎私信技术交流????。那么现在就正式进入Flow的世界吧! Flow简介 Flow是什么❓ A suspending function asynchronously returns a single value, but how can we return multiple asynchronously computed

Pumpkin's Blog 8756

讲一下kotlin的Flow

总之,Kotlin Flow 是一种强大的工具,可以帮助你处理异步操作的结果,并在不同的组件之间传递和转换数据。转换操作符:Flow 提供了许多转换操作符,可以对流中的值进行转换和处理。操作符可以指定重试的次数和条件,以便在发生异常时自动重新执行流的操作。操作符可以将流中的值缓冲起来,以便在需要时一次性处理多个值,而。操作符可以将多个流中的值一一对应地组合成一个新的值。操作符可以将多个流中的值组合成一个新的值,而。操作符可以过滤流中的值,只保留满足条件的值。操作符可以将流中的每个值转换为另一个值,

challenge51all的专栏 1351

【Kotlin】Flow简介

Flow 是 Kotlin 标准库中的一个新的异步流处理框架,旨在简化异步数据流的操作和处理,它提供了一种声明式的方式来处理数据流。Flow 中一些接口调用有些类似 Sequence(详见 →),协程的使用详见 →。Flow 有以下特性和概念。:Flow 允许以一种非阻塞的方式处理一系列的值或事件,这使得在处理大量数据或涉及 IO 操作时能够更加高效。:只有在收集器(collector)订阅(或启动)了之后才会开始发射(emit)数据。

little_fat_sheep 5089

Kotlin Coroutines Flow 系列(一) Flow 基本使用

一. Kotlin Flow 介绍Flow 库是在 Kotlin Coroutines 1.3.2 发布之后新增的库。官方文档给予了一句话简单的介绍:Flow — cold async...

Java与Android技术栈 3799

Kotlin flow实践总结

背景 最近学了下Kotlin Flow,顺便在项目中进行了实践,做一下总结。 Flow是什么 按顺序发出多个值的数据流。 本质就是一个生产者消费者模型,生产者发送数据给消费者进行消费。 冷流:当执行collect的时候(也就是有消费者的时候),生产者才开始发射数据流。 生产者与消费者是一对一的关系。当生产者发送数据的时候,对应的消费者才可以收到数据。 热流:不管有没有执行collect(也就是不管有没有消费者),生产者都会发射数据流到内存中。 生产者与消费者是一对多的关系。当生产者发送数据的时候,多个

嘴巴吃糖了 4923
上一篇: Android Enable 和clickable
下一篇: HashMap中的哈希冲突
JerryQuary
博客等级 码龄9年 24粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值