如何启动和取消协程 在 Jetpack 组件里,我们为各个组件提供了对应的 scope,比如 ViewModel 就有与之对应的 viewModelScope,如果您想在这个作用域里启动协程,使用如下代码即可...如前所述,我们使用 LiveData 连接 View 和 ViewModel,而在 ViewModel 这里我们则使用刚刚提到的 liveData 协程构造方法来打通 LiveData 和协程,再往右就是调用...我们从 Flow 中使用 collect 方法获取每一个结果,然后 emit 出来给 liveData 协程构造方法使用: val currentWeatherFlow: LiveData使用协程、LiveData 和 Flow 已经有了比较系统的认识。...和 Flow 有任何疑问和想法,欢迎在评论区和我们分享。
LiveData 也可以在视图和 ViewModel 双向通信范围之外工作,甚至连 Room 等其他组件也支持 LiveData。但是,滥用 LiveData 也会带来风险,尤其是在涉及多线程的时候。...解决方法: 我们并没有扩展 LiveData 的功能,而让它可以无缝和 Kotlin 协程整合工作。...在本次演讲中,Jose Alcérreca 和 Yigit Boyar 为大家讲解了全新的 LiveData 协程构建方法,何时以及如何使用它,以及一些用来打造简洁、高效和强健的反应式 UI 的模式 (...请在观看主题演讲或分会场演讲时使用下方入口提交问题。...请使用如下地址提交问题: services.google.cn/fb/forms/as… 点击这里进入 Android Dev Summit 中文官方网站 ?
如果您是库作者,您也许希望用户在使用 Kotlin 协程与 Flow 时可以更加轻松地调用您基于 Java 或回调的 API。...本文将会介绍如何使用协程和 Flow 简化 API,以及如何使用 suspendCancellableCoroutine 和 callbackFlow API 创建您自己的适配器。...我们使用可以添加到 getLastLocation 方法中的回调来在合适的时机恢复协程。...在挂起函数的协程中获得 Continuation。...不同于 flow 流构建器,channelFlow 可以在不同的 CoroutineContext 或协程之外使用 offer 方法发送数据。
#launchIn 函数指定流收集协程 ---- 1、指定流收集协程 响应式编程 , 是 基于事件驱动 的 , 在 Flow 流中会产生源源不断的事件 , 就是 发射元素操作 ; 拿到 Flow 流后...是 协程任务对象 , 可调用 Job#cancel 函数取消该协程任务 ; 2、Flow#launchIn 函数原型 Flow#launchIn 函数原型 : /** * 终端流操作符,在[作用域]中...* * 此操作符通常与[onEach], [onCompletion]和[catch]操作符一起使用,以处理所有发出的值 * 处理上游流或处理过程中可能发生的异常,例如: * * ``` *...runBlocking 主协程 的子协程, 需要调用 join 等待协程执行完毕 } } /** * 使用 flow 构建器 Flow 异步流 *...---- Flow 流的 收集元素 操作 , 是在协程中执行 , 将 协程 取消 , 即可将 Flow 流收集操作 取消 , 也就是 将 Flow 流取消 ; 代码示例 : 使用 withTimeoutOrNull
先搞清楚,什么是协程。 你可能已经听过『进程』和『线程』这两个概念。 进程就是二进制可执行文件在计算机内存里的一个运行实例,就好比你的.exe文件是个类,进程就是new出来的那个实例。...协程,有几个特点: 协同,因为是由程序员自己写的调度策略,其通过协作而不是抢占来进行切换 在用户态完成创建,切换和销毁 ⚠️ 从编程角度上看,协程的思想本质上就是控制流的主动让出(yield)和恢复(resume...0)生成器正确使用 既然生成器不能像函数一样直接调用,那么怎么才能调用呢?...你可以使用下面的代码来测试: 协程堆栈 鸟哥文中还有一个协程堆栈的例子。 我们上面说过了,如果在函数中使用了yield,就不能当做函数使用。 所以你在一个协程函数中嵌套另外一个协程函数: <?
# 一个简单的小爬虫,将3个页面的数据保存到data.html,对比协程和非协程的使用时间 """协程 1、通过urlopen获取数据 2、写入文件 3、使用三个页面,通过gevent.joinal执行...(协程会在IO阻塞处切换),用时短 4、在Windows系统,由于捕获IO较慢。...使用monkey.patch_all(),加快IO捕获,Linux系统不存在此问题 """ from urllib.request import urlopen import gevent from
Go协程的基本概念和使用go的协程作为一种更为轻量级的执行单元,与传统的线程相比,goroutine的创建和切换开销很小(这里主要是基于GMP模型,goroutine定义在用户态,只需要P将其队列中的G...,即可创建一个goroutine:例如 go func1()但是goroutine使用简单并且具备轻量级的特点会导致我们容易忽略可能存在的问题goRoutine在使用时需要注意的goroutine使用中的三个核心点...:定义一个上下文用来做超时机制context.WithTimeOut,使用无缓冲的chan来作为接受方和发送方的同步接受数据的操作ch:=make(chan result),使用go起一个协程来执行某个函数...协程中的发送者则会导致无法在通道chan上发送。...存在的,在main中再起了一个协程,而主函数对应的协程没有等该协程执行完成就结束了。
Kotlin Flow 是基于 Kotlin 协程基础能力搭建的一套数据流框架,从功能复杂性上看是介于 LiveData 和 RxJava 之间的解决方案。...并且在 Kotlin 协程的加持下,Kotlin Flow 目前是 Google 主推的数据流框架。 1. 为什么要使用 Flow?...不过 Flow 是基于协程,在协程会有一些学习成本,但这个应该拆分来看。...可以看到,这些协程 API 在视图离开某个状态时会挂起协程,能够避免更新视图。但是 Flow 会持续生产数据,也会产生一些不必要的操作和资源消耗(CPU 和内存)。...Channel 通道 在协程的基础能力上使用数据流,除了上文提到到 Flow API,还有一个 Channel API。
文章目录 一、协程挂起 和 线程阻塞 对比 1、协程挂起 2、线程阻塞 3、挂起和阻塞对 UI 的影响 4、挂起分析 一、协程挂起 和 线程阻塞 对比 ---- 挂起是协程中的概念 , 只能在协程中使用...; 阻塞是线程中的概念 , 可以在主线程和子线程中使用 ; 1、协程挂起 协程 挂起 操作 : 在协程中使用 delay 函数 , 挂起 20 秒时间 , 然后 20 秒后更新 UI ; delay...函数是 挂起 suspend 函数 ; // 创建协程 GlobalScope.launch(Dispatchers.Main) { delay(20000) // 主线程更新 UI...Log.i("MainActivity", "GlobalScope : 主线程更新 UI") } 2、线程阻塞 主线程 阻塞 操作 : 在主线程 中使用 Thread.sleep 函数 , 阻塞 20..., 会将挂起点的状态保存 , 同时协程停止执行 , 等待挂起函数执行完毕后 , 协程继续执行 ; 相当于阻塞的是协程 , 不会阻塞主线程 ;
Flow 是协程的扩展,如果要在 Room 和 Retrofit 中使用,Room 和 Retrofit 需要支持协程才可以,在 Retrofit >= 2.6.0 和 Room >= 2.1 版本都支持协程...,使用 LiveData 协程构造方法 (coroutine builder),这个方法也是在 PokemonGo 项目中用到的方法。...的数据 emit(it) } } liveData{ ... } 协程构造方法提供了一个协程代码块,产生的是一个不可变的 LiveData,emit() 方法则用来更新...asLiveData 是 Flow 的扩展函数,返回值是一个 LiveData liveData{ ... } 协程构造方法提供了一个协程代码块,在 liveData{ ... } 中执行协程代码 collect...Observer { // 将数据显示在页面上 }) 方式二: 使用 LiveData 协程构造方法 (coroutine builder) 提供的协程代码块,产生的是一个不可变的 LiveData
# 一个简单的小爬虫,将3个页面的数据保存到data.html,对比协程和非协程的使用时间 """非协程 1、通过urlopen获取数据 2、写入文件 3、使用三个页面,通过for循环执行(非协程会在IO
稍后我们会了解到 LiveData 还可以 启动协程 和 创建复杂的数据转换,这可能会需要花点时间。...接下来我们一起比较 LiveData 和 Kotlin 数据流中相对应的写法吧: #1: 使用可变数据存储器暴露一次性操作的结果 这是一个经典的操作模式,其中您会使用协程的结果来改变状态容器: △ 将一次性操作的结果暴露给可变的数据容器...liveData 协程构建器所使用的方法是 添加一个 5 秒钟的延迟,即如果等待 5 秒后仍然没有订阅者存在就终止协程。...Activity 和 Fragment 提供了若干协程构建器: Activity.lifecycleScope.launch : 立即启动协程,并且在本 Activity 销毁时结束协程。...Fragment.lifecycleScope.launch : 立即启动协程,并且在本 Fragment 销毁时结束协程。
一般开发中所接触到的协程类和接口无非是 launch, async, Dispatch.IO...,这些概念是对我们开发者来说的。进入协程源码的世界之后,这些概念就会被一些内部概念所替代。...在协程中,最小的调度粒度是协程,在kotlin中叫coroutine。...外部概念和内部概念 协程中外部概念和内部概念的差别很大。对应开发者来说,一个协程的最小粒度coroutine,在协程的内部概念中叫DispatchedContinuation。...为什么可以提升效率,在Kotlin协程-协程设计的基础中有具体解释。...不知道过个十年kotlin和js有哪个还能被开发者使用。
使用协程和Flow,我们可以将网络请求抽象为一个数据流,用一个简单的函数来描述网络请求的过程。 1.1 Flow的用法 Flow是Kotlin提供的一种响应式流处理库,用于处理异步、时间相关的操作。...Flow的主要特点是支持协程,可以在协程中进行数据收集和处理。以下是Flow的基本用法: 创建Flow:使用flow函数创建一个Flow,然后在Flow中使用emit函数发射数据。...Flow是一种Cold Stream,它只有在被收集时才会产生数据。Flow的数据发射和收集都是在协程中进行的,因此可以利用协程的特性进行异步处理、取消和暂停。...最后,在协程中调用ApiService的方法发起网络请求,并打印获取到的用户信息。 这个示例展示了如何使用Retrofit优雅地实现网络请求。...我们可以在collect函数中处理数据。 四、总结 使用协程+Flow+Retrofit+OkHttp,我们可以优雅地实现网络请求。
),并且通过接口coroutine_resume在调度器下面创建了两个协程co1和co2,然后通过调度器循环去拉起其中一个协程,直到一个协程执行完毕。...cap/size:栈的容量和当前使用栈空间的大小 status,协程的状态信息,是处于就绪状态(COROUTINE_READY)?...而libco基于性能优化考虑,没有使用ucontext,而是自己用汇编写了一套上下文切换的代码,在文件coctx_swap.S里面,他这里面只保存和恢复了寄存器内存和栈内容,相比于ucontext,少了浮点数上下文和...一开始,我们就把sp指向我们的栈空间,所以在协程内发生函数调用的时候,被调函数的函数头会有mov rsp rbp和push rbp,此时实际rbp也是指向我们分配的栈空间,所以真正栈空间里面是ebp和esp...,引发执行流程错乱(所以在使用这类库的时候,应该将函数的实现和协程主流程分开,以避免因为逻辑修改导致协程不可恢复的场景) 对于无栈协程来说,执行流的恢复只是通过找到下一条指令的执行地址,但是不包括上下文
文章目录 一、协程的挂起和恢复概念 二、协程的 suspend 挂起函数 一、协程的挂起和恢复概念 ---- 函数 最基本的操作 是 : 调用 call : 通过 函数名或函数地址 调用函数 ; 返回...return : 函数执行完毕后 , 继续执行函数调用的下一行代码 ; 协程 在 调用 call 和 返回 return 基础上 , 又新增了两种 状态 : 挂起 Suspend : 暂停当前执行的协程..., 只能在 协程体内部 或者 其它挂起函数 中调用 ; 协程外部不允许使用挂起函数 ; 在协程中 , 执行 挂起 Suspend 函数 , 将 挂起点的信息 记录下来 , 然后执行耗时操作 , 执行完毕后...恢复 Resume ; 二、协程的 suspend 挂起函数 ---- 声明挂起函数 , 使用 suspend 在 fun 关键字之前 修饰函数 , 如 : public suspend fun Test...){} 中 , 可以直接调用挂起函数 ; 挂起 函数 , 只能在 协程体内部 或者 其它挂起函数 中调用 ; 协程外部不允许使用挂起函数 ; 在协程中 , 执行 挂起 Suspend 函数 , 将 挂起点的信息
其实不能叫扯上关系吧,ViewModel和LiveData属于「架构组件」,而协程是「异步工具类」,ViewModel和LiveData搭上了协程这条快车道,让Google推了几年的AAC架构更加快的让人接受了...这两哥们可谓是形影不离,网上的很多文章,几乎也都会同时提到它们,但是...当协程的Flow稳定之后,这两个好兄弟就突然出现了隔阂,当然,其实隔阂绝不是一天就有的,这也许是压死LiveData的最后一根稻草...,毕竟协程没法在Java中使用)。...的协程构造器提供了一个协程代码块,这就是LiveData的协程作用域,当LiveData被注册的时候,作用域中的代码就会被执行,而当LiveData不再被使用时,里面的操作就会因为结构化并发而取消。...而且该协程构造器返回的是一个不可变的LiveData,可以直接暴露给对应的UI层使用,在作用域中,可以通过emit()函数来更新LiveData的数据。 这样整体流程就通了,而且,非常简单不是吗?
我要说的是 Kotlin,Kotlin 在 2017 得到了 Android 官方的公开支持,在接下来这几年里,Kotlin 自身越来越完善,它的协程也越来越完善。...协程的 Flow 和 RxJava 的功能范围非常相似——其实我觉得就是一样的——但是 Flow 是协程里必不可少的一部分,而协程是 Kotlin 里必不可少的一部分,而 Kotlin 是 Android...Flow; LiveData 的使用比较简单,而且功能上对于简单场景也是足够的,而 RxJava 和 Flow 这种东西学起来就没 LiveData 那么直观。...简单说就是,为了 Java 语言的使用者和不想学 RxJava 或者 Flow 的人,LiveData 会被保留。不过你如果用发展的眼光去看他这番话……你懂我意思吧? 那我走?...另一方面,在用 LiveData 的人,确实可以考虑摘除它了;但也不是着急忙慌地把它拿走,它不是毒药不是地雷,只是协程的 Flow 现在可以做这件事了,而未来 Flow 一定是会成为主流的,就像现在的
在之前的Flow,collect函数浅析和仿Flow构建器创建数据流文章中我们探索了flow的简单使用及它的简单原理,但是生产过程中我们往往会借用这些基础的api实现我们复杂的逻辑处理,根据需求也推出了...接下来开始看下这几个Flow的特殊之处和应用场景吧~~官方推荐的Flow数据流流向:数据流程数据流包含三个实体:提供方会生成添加到数据流中的数据。得益于协程,数据流还可以异步生成数据。...类似于观察数据,数据更新,使用方接受最新数据是不是和LiveData很像。...: 对于LiveData来说,通过观察调用observe函数的时候传入LifecycleOwner内部注册生命周期回调的方式相比;Flow的观察collect函数需要在协程中调用也就是需要自动管理协程的生命周期...但是我们可以使用repeatOnLifecycle,它当离开某个生命周期的时候进行取消,符合的时候在开启一个新协程(也即会重新执行collect函数是新的订阅者)。
在invoke (或 call) 和 return 之外,协程新增了 suspend 和 resume: suspend — 也称挂起或暂停,用于暂停执行当前协程,并保存所有局部变量; resume —...您只能够在 suspend 函数中调用另外的 suspend 函数,或者通过协程构造器 (如 launch) 来启动新的协程。 搭配使用 suspend 和 resume 来替代回调的使用。...Kotlin 提供了三个调度器,您可以使用它们来指定应在何处运行协程: 如果您在 Room 中使用了 suspend 函数、RxJava 或者 LiveData,Room 会自动保障主线程安全。...此外,在 Dispatchers.Default 和 Dispatchers.IO 中进行切换也得到了优化,以尽可能避免了线程切换所带来的性能损失。 下一步 本篇文章介绍了使用协程来解决什么样的问题。...在 Android 平台上,您可以使用协程来处理两个常见问题: 似于网络请求、磁盘读取甚至是较大 JSON 数据解析这样的耗时任务; 线程安全,这样可以在不增加代码复杂度和保证代码可读性的前提下做到不会阻塞主线程的执行
领取专属 10元无门槛券
手把手带您无忧上云