首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【Kotlin 协程】协程底层实现 ③ ( 结构化并发 | MainScope 作用域 | 取消协程作用域 | Activity 实现 CoroutineScope 协程作用域接口 )

是一个 函数 , 其返回值类型为 CoroutineScope 协程作用域 ; 这是使用了设计模式中的 工厂模式 , 生产一个 协程作用域 实例对象 ; 之后的 协程操作都要定义在该协程作用域中 ;...与之前使用的 GlobalScope 协程作用域 作用相同 , 执行 lunch 函数 , 后面的代码块就是协程作用域 , 在其中执行协程任务 ; CoroutineScope.launch 函数...Log.i("MainActivity", "GlobalScope : 主线程更新 UI") } 如果在 协程作用域 中 , 执行一个挂起函数 , 如 delay 函数 , 则可以不用 Dispatchers.IO...消该 协程作用域 , 同时 该协程作用域内的协程任务不管是否执行完毕 都一并取消 , 该函数是 CoroutineScope 的扩展函数 ; /** * 取消这个范围,包括它的作业和它的所有子任务...接口 , public interface CoroutineScope { public val coroutineContext: CoroutineContext } 即可 将整个 协程作用域

1.3K11

如何正确的在 Android 上使用协程 ?

这两点,也正是使用协程中所需要注意的。既然不建议直接使用 GlobalScope,我们就先试验一下使用它会是什么效果。...直接使用 GlobalScope 的 async 或者 launch 方法是强烈不建议的。 GlobalScope 创建的协程没有父协程,GlobalScope 通常也不与任何生命周期组件绑定。...所以,GlobalScope 能不用就尽量不用。 MainScope 官方文档中提到要使用自定义的协程作用域,当然,Kotlin 已经给我们提供了合适的协程作用域 MainScope 。...那么如何在 ViewModel 中定义协程作用域呢?还记得上面 MainScope() 的定义吗?没错,搬过来直接使用就可以了。...当 ViewModel.onCleared() 被调用的时候,viewModelScope 会自动取消作用域内的所有协程。

2.8K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    协程中的取消和异常 | 驻留任务详解

    协程的最佳实践 由于本文所介绍的模式是在协程的其它最佳实践的基础之上实现的,我们可以借此机会回顾一下: 1. 将调度器注入到类中 不要在创建协程或调用 withContext 时硬编码调度器。...我们想要此操作的运行时长超过 viewModelScope,这个目的要如何达成呢? 我们需要在 Application 类中创建自己的作用域,并在由它启动的协程中调用这些操作。...与稍后将在本文中看到的其他解决方案 (如 GlobalScope) 相比,创建自己的 CoroutineScope 的好处是您可以根据自己的想法对其进行配置。...相反,您必须传递一个通用的 CoroutineContext 给 GlobalScope 启动的所有协程。 建议: 不要直接使用它。...就像使用 GlobalScope 时那样,您也需要传递一个通用的 CoroutineContext 到所有通过 GlobalScope 启动的协程中。

    1.5K20

    6个Android Kotlin协程相关面试题

    通常用于不返回结果的异步操作,如日志记录或执行后台任务。 async:返回一个Deferred对象,它也是Job的一种,但可以通过await()方法获取协程的结果。...示例代码: // 使用launch启动一个不返回结果的协程 GlobalScope.launch { delay(1000) println("World!")...当你在一个协程作用域(如lifecycleScope或viewModelScope)中启动多个协程时,这些协程会一起执行,并且当作用域被取消时,所有协程都会被取消。...作为Android资深开发专家和面试官,以下是一些关于Kotlin协程的深度面试题及其详细解答: 面试题目6:Kotlin协程与线程有什么区别?如何在Android中使用协程进行异步编程?...以下是一个简单的示例,展示如何在Android中使用协程进行异步编程: import kotlinx.coroutines.* import kotlinx.coroutines.Dispatchers.IO

    26010

    协程到底是怎么切换线程的?

    } 可以看出CoroutineScope的代码很简单,主要作用是提供CoroutineContext,协程运行的上下文 我们常见的实现有GlobalScope,LifecycleScope,ViewModelScope...等 GlobalScope与ViewModelScope有什么区别?...CoroutineContext,获取当前的拦截器 因为当前的拦截器是CoroutineDispatcher,因此最终会返回一个DispatchedContinuation,我们其实也是利用它实现线程切换的 我们将协程体的...我们在协程体内,可能通过withContext方法简单便捷的切换线程,用同步的方式写异步代码,这也是kotin协程的主要优势之一 fun test(){ viewModelScope.launch...kotlin协程到底是怎么切换线程的这个问题,并对源码进行了分析 简单来讲主要包括以下步骤: 向CoroutineContext添加Dispatcher,指定运行的协程 在启动时将suspend block

    87720

    Coroutine(协程)(一)

    其实GlobalScope.launch可以通过Thread来替代,但要注意delay是一个特殊的 挂起函数 ,它不会造成线程阻塞,但是会 挂起 协程,并且只能在协程中使用。...} println("Hello,") job.join() // 等待直到子协程执行结束 } 现在,结果仍然相同,但是主协程与后台作业的持续时间没有任何关系 当我们使用 GlobalScope.launch...在协程内部可以像普通函数一样使用挂起函数, 不过其额外特性是,同样可以使用其他挂起函数(如本例中的 delay)来挂起协程的执行。...在 GlobalScope中启动的活动协程并不会使进程保活。...协程调度器可以将协程限制在一个特定的线程执行,或将它分派到一个线程池,亦或是让它不受限地运行。

    85410

    Kotlin | 协程使用手册(不间断更新)

    ,将直接运行在当前线程 子协程 当一个协程被其他协程在 CoroutineScope 启动时,它将通过 CoroutineScope.CoroutineContext 来承袭上下文,并且这个新协程将成为父协程的子作业...当一个父协程被取消时,同时意味着所有的子协程也会取消。 然而,如果此时用 GlobalScope.launch启动子协程,则它与父协程的作用域将无关并且独立运行。...在我们了解了上面的概念之后,我们开始将前面学到的结合在一起。...这里为了节省代码,仿 onDestory 的作用 效果,点击btn1之后,再点击btn2,将只会弹出一个toast,第二个toast将不会弹出 线程局部数据 将一些局部数据传递到协程之间通过 ThreadLoacl...,通常使用 withContext 切换上下文 (简单理解切换线程,不过也并不准确,因为协程的上下文包含很多数据,如value等,我们通常只是用来切换线程) ,但是 flow{} 构建器中的代码必须遵循上下文保存属性

    2.4K20

    【Kotlin 协程】协程底层实现 ④ ( 结构化并发 | viewModelScope 作用域示例 )

    文章目录 一、viewModelScope 作用域作用 二、viewModelScope 作用域示例 常见的 CoroutineScope 协程作用域 : GlobalScope : 该作用域是 进程级别的...Activity 中使用 , 与 Activity 生命周期绑定 ; 一、viewModelScope 作用域作用 ---- viewModelScope 协程作用域 需要绑定 ViewModel 生命周期..., 在特定界面中 , 如可旋转屏幕的 Activity 界面中 , 如果使用 MainScope 协程作用域 , 当屏幕旋转时 , 就会在 onDestory 生命周期函数中 取消协程作用域 , 此时协程相关的临时数据都被取消了...; 当旋转 Activity 界面时 , 会调用当前 Activity 的 onDestory 生命周期函数 , 自然对应的协程作用域也会被取消 , 因此引入 viewModelScope 作用域 ,...避免协程临时数据被销毁 ; 二、viewModelScope 作用域示例 ---- 项目地址 : https://github.com/han1202012/Coroutine https://download.csdn.net

    99820

    你以为精通Kotlin协程?这5个冷门机制才是面试官的终极杀招

    一、为什么90%的开发者栽在协程"冷门机制"上? 真实案例:某候选人用协程实现直播间弹幕系统,却在百万级并发下因结构化并发失效导致内存泄漏,最终被快手挂掉T3-2评级。...据2025年字节跳动技术报告,78%的Kotlin协程面试挂科源于冷门机制盲区。 薪资对照表: 层级 能力边界 典型问题 20k以下 会用launch/async "协程和线程有什么区别?"...二、2025年大厂必问的5个协程冷门机制 机制1:结构化并发失效的幽灵内存泄漏(美团优选压轴题) 场景还原:某社交APP的私信模块使用GlobalScope启动协程,用户频繁切换页面后出现OOM崩溃...底层原理: 结构化并发要求协程生命周期与组件绑定(如ViewModel的viewModelScope) GlobalScope会脱离组件生命周期独立运行 2....取消传播机制: 父协程取消会递归取消所有子协程 但withContext(NonCancellable)可创建不可取消的代码块 2.

    6210

    Kotlin 协程的上下文和调度器介绍-Dispatchers

    挂起后,它恢复线程中的协程,而这完全由被调用的挂起函数来决定。非受限的调度器非常适用于执行不消耗 CPU 时间的任务,以及不更新局限于特定线程的任何共享数据(如UI)的协程。...并且之后在协程中使用withContext来改变协程的上下文,而仍然驻留在相同的协程中。 得到上面的输出结果。...并且这个新协程的Job对象将会成为父协程的子Job对象。 当一个父协程被取消的时候,所有它的子协程也会被递归的取消。 但是,当使用 GlobalScope 来启动一个协程时,则新协程的作业没有父作业。...// 孵化了两个子作业, 其中一个通过 GlobalScope 启动 GlobalScope.launch { println("job1: 我运行在GlobalScope...那么如果能够将一些数据在协程与协程之间传递。那么将会大大提高效率。

    45810

    ViewModel再问—字节真题

    2.0之后呢,是因为不管是Activity或者Fragment,都实现了LifecycleOwner接口,所以ViewModel是可以通过Lifecycles感知到他们的生命周期,从而进行实例管理的。...ViewModelScope了解吗 这里主要就是考ViewModel和其他一些组件的关系了。关于协程,之前也专门说过一篇,主要用作线程切换。...如果在多个协程中,需要停止某些任务,就必须对这些协程进行管理,一般是加入一个CoroutineScope,如果需要取消协程,就可以去取消这个CoroutineScope,他所跟踪的所有协程都会被取消。...GlobalScope.launch { longRunningFunction() anotherLongRunningFunction() } 但是这种全局使用方法,是不被推荐使用的...所以只要使用了 ViewModel,就可以使用 viewModelScope在 ViewModel 中启动各种协程,而不用担心任务泄漏。

    1.8K20

    Kotlin协程实现原理:CoroutineScope&Job

    Kotlin协程实现原理:Suspend&CoroutineContext 如果你已经接触过协程,相信你都有过以下几个疑问: 协程到底是个什么东西?...如果你觉得陌生,那么GlobalScope、lifecycleScope与viewModelScope相信就很熟悉了吧(当然这个是针对于Android开发者)。...既然Job是来管理协程的,那么它提供了六种状态来表示协程的运行状态。...它的作用是暂停当前运行的协程任务,立刻执行自身Job的协程任务,直到自身执行完毕之后才恢复之前的协程任务继续执行。 本篇文章主要介绍了CoroutineScope的作用与Job的相关状态演化与运用。...希望对学习协程的伙伴们能够有所帮助,敬请期待后续的协程分析。

    1.6K40

    【Kotlin 协程】协程底层实现 ② ( 协程调度器 | 协程任务泄漏 | 结构化并发 )

    中运行 , 处理 UI 交互任务 ; 使用场景如 : 调用 挂起 suspend 函数 , 更新 UI , 更新 LiveData ; Dispatchers.IO 调度器 : 在 子线程 中运行 ,...处理 文件操作 和 网络 IO 操作 ; 使用场景如 : 数据库增删查改 , 文件读写处理 , 网络数据处理 ; Dispatchers.Default 调度器 : 在 子线程 中运行 , 处理 CPU...Dispatchers.Default 调度器 都是在子线程 中执行耗时任务 , 但是在取消任务方面 , 磁盘或网络操作 与 CPU 密集型操作 是不同的 , 需要采用不同的任务取消策略 , 因此这里将耗时任务分配成两种调度器...协程作用域 , 其会追踪所有的 协程任务 , CoroutineScope 协程作用域 可以取消 所有由其启动的协程任务 ; 常见的 CoroutineScope 协程作用域 : GlobalScope...被销毁 , 则 在 onDestory 生命周期函数中取消协程任务 ; viewModelScope : 该作用与仅在 ViewModel 中使用 , 与 ViewModel 生命周期绑定 ; lifecycleScope

    70420

    【Kotlin 协程】Channel 通道 ① ( Channel#send 发送数据 | Channel#receive 接收数据 )

    Channel 通道 是 并发的安全队列 , 不同的协程之间 可以 借助 Channel 通道 进行通信 ; 协程 中 也涉及到 生产消费模式 , 生产者 协程 产生数据 , 将数据通过 Channel...发送元素 的操作是不执行的 ; Channel 通道 与 Flow 异步流是不同的 , 生产者协程 产生数据 和 消费者协程 消费数据 是同时进行的 ; 二、Channel#send 发送数据 ---...如果当前协程的[Job]被取消或完成 * 函数挂起后,该函数立即恢复并返回[CancellationException]。 * 有**立即取消保证**。...如果作业被取消,而此函数被取消 * 暂停,将无法成功恢复。'...如果作业被取消,而此函数被取消 * 暂停,将无法成功恢复。' receive '调用可以从通道中检索元素, * 但随后抛出[CancellationException],从而无法交付元素。

    87020

    【Kotlin 协程】Channel 通道 ③ ( CoroutineScope#produce 构造生产者协程 | CoroutineScope#actor 构造消费者协程 )

    #produce 函数原型 CoroutineScope#produce 函数原型 : /** * 启动一个新的协程,通过将值发送到通道来生成值流 * 并返回对协程的引用作为[receichannnel...* * 协程的作用域包含[ProducerScope]接口,该接口实现 * [CoroutineScope]和[SendChannel],这样协程就可以调用 * [将][SendChannel。...* 父作业也继承自[CoroutineScope],但它也可以被重写 * 使用相应的[context]元素。...* * 此协程中任何未捕获的异常将以此异常作为原因和关闭通道 * 结果通道将变成_failed_,因此此后任何试图从它接收的尝试都会抛出异常。...* 父作业也继承自[CoroutineScope],但它也可以被重写 * 带有相应的[context]元素。 * * 默认情况下,协程立即被安排执行。

    51710

    Kotlin就几行代码? 用SharedFlow写个FlowEventBus

    image.png 背景 跨页面通信是一个比较常见的场景,通常我们会选择使用EventBus,但EventBus无法感知生命周期,收到消息就会回调,所以有了LiveData之后很快就有了LiveEventBus...FlowEventBus 常用消息总线对比 image.png 设计构思 通过学习 从 LiveData 迁移到 Kotlin 数据流  得到思路: SharedFlow作为事件载体 : 优点: 依托协程轻松切换线程...不仅可以全局范围的事件,也可以单页面内的通信而不透传到别的页面,如:Activity内部,Fragment内部通信。... {     ... } //接收 App Scope事件 observeEvent {     ... } Like ObserveForever: //此时需要指定协程范围...fragment,StickyEvent::class.java)  removeStickyEvent(activity,StickyEvent::class.java) 原理 以上功能依托于Kotlin协程的

    1K10
    领券