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

破解 Kotlin (4) - 异常处理篇

究竟使用什么 Scope,大家自己根据实际情况来确定,给出一些建议: 对于没有作用域,但需要启动的时候,适合用 GlobalScope 对于已经有作用域的情况(例如通过 GlobalScope...启动体内),直接用启动启动 对于明确要求子程之间相互独立不干扰,使用 supervisorScope 对于通过标准库 API 创建的,这样的比较底层,没有 Job、作用域等概念的支撑...异常在作用域内的传播:当出现异常,会根据当前作用域触发异常传递,GlobalScope 会创建一个独立的作用域,所谓“自成一派”,而 coroutineScope 当中异常会触发父的取消...join 和 await 的不同:join 只关心是否执行完,await 则关心运行的结果,因此 join 出现异常也不会抛出该异常,而 await 则会;考虑到作用域的问题,如果异常...附加说明 join 被取消时有一个 bug 会导致不抛出取消异常准备本文发现该问题,目前已经提交到官方并得到了修复,预计合入到 1.2.1 发版,大家有兴趣可以查看这个 issue:No

1.3K10

写给Android工程师的指南

当 Kotlin 出现之后,上述问题可以说真正意义上得到了好的解法。其良好的可读性及api设计,使得无论是新手还是老手,都能快速享受到带来的舒适体验。...同时启动10w线程和协 官网,我们大概都能看到这样一句话,同时启动10w和线程和协等等。...我们举个例子来看看,如下所示: 同时启动10w线程 同时启动10w 果然比线程快多了,那此时肯定就有同学说了,你拿欺负线程,咋不用线程池呢?...结果如下: 添加10w个任务 启动10w个协 ???为什么线程池更快呢?...这里使用了 SupervisorJob() 的原因是,异常是会传递的,比如当一个子发生异常,它会影响它的兄弟与它的父

1.3K40
您找到你想要的搜索结果了吗?
是的
没有找到

Android 开发中使用 | 上手指南

注意: 被挂起,系统会以抛出 CancellationException 的方式协作取消协。捕获顶级异常 (如Throwable) 的异常处理程序将捕获此异常。...如果您做异常处理消费了这个异常,或从未进行 suspend 操作,那么将会徘徊于半取消 (semi-canceled) 状态下。...失败发出报错信号 中,报错信号是通过抛出异常来发出的,就像我们平常写的函数一样。来自 suspend 函数的异常将通过 resume 重新抛给调用方来处理。...还记得一开始说的结构化并发是一系列编程语言特性和实践指南的集合, suspend 函数中引入无关联作用域违背了结构化并发规则。...同样,还帮助您更深入去理解和使用 suspend 函数,通过确保它们函数返回之前完成任务,或者是通过暴露异常来确保它们正确发出错误信号。

1.4K20

Kotlin 学习笔记(四)—— 的基础知识,面试官的最爱了~

要说上下文我们的开发中如何使用,找了下网上的一些资料,提到较多的就是异常的捕获了。...CoroutineExceptionHandler 可以让我们启动设置一个统一的异常处理器,如果出现异常,就会执行相应的操作。这里的上下文还设置了运行的线程为 Main 主线程。...3.2 调度器 3.1 中已经出现过调度器的身影,就是当需要指定运行的线程,使用调度器调度即可。实际的使用中是通过 Dispatchers 对象来访问它们。...这也是为什么我们可以中用写同步代码的思想,去写异步的逻辑。...async/await: Deferred:同样用于执行任务,成对出现,await 可以得到 async 异步操作后得到的执行结果 launch 方法之前已经介绍的再清楚不过了,这里看看另外的两种。

1.4K30

《快学 Go 语言》第 11 课 —— 千军万马跑

(main goroutine)里面,上面的例子中我们里面启动了一个子,子启动了一个孙子,孙子启动了一个曾孙子。...子异常退出 使用子一定要特别注意保护好每个子,确保它们正常安全的运行。因为子异常退出会将异常传播到主,直接会导致主也跟着挂掉,然后整个程序就崩溃了。...,主异常退出时会打印堆栈信息。...的个人电脑上,这个程序瞬间创建了 200w 个协,观察发现内存占用在 4G 多,这意味着每个协的内存占用大概 2000 多字节。...同一个线程中最多只会存在一个处于运行态的,就绪态的是指那些具备了运行能力但是还没有得到运行机会的,它们随时会被调度到运行态,休眠态的还不具备运行能力,它们是等待某些条件的发生,比如 IO

87420

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

所以实际应用中,我们更推荐 : 执行操作所在指定作用域内启动,而非随意使用 的取消与超时 cancelAndJoin 取消一个并等待结束 runBlocking {...注意 概念上,async 就类似于 launch。它启动了一个单独的,这是一个轻量级的线程并与其它所有的一起并发的工作。...,将直接运行在当前线程 子 当一个被其他 CoroutineScope 启动,它将通过 CoroutineScope.CoroutineContext 来承袭上下文,并且这个新将成为父的子作业...当一个父被取消,同时意味着所有的子也会取消。 然而,如果此时用 GlobalScope.launch启动,则它与父的作用域将无关并且独立运行。...注意:onReceiver 已经该关闭的通道执行会发生失败并抛出异常,我们可以使用onReceiveOrNull 子句关闭通道执行特定操作

2.2K20

Kotlin系列(三)

本节,我们来探讨一下官方框架的更多功能,并将其运用到实际的生产当中,在这里,Android中使用kotlin官方框架为例进行讲述。...2.launch函数启动一个   Android开发中,我们一般将的作用域和Android组件的lifeCycle绑定在一起,这样,当组件销毁的时候,的作用域就会取消,也就销毁了,这样不会造成内存泄漏...,也就是start参数所设置的,总共有四种启动模式,如下所示: DEFAULT:创建程之后,立即开始调度,调度前如果被取消,其将直接进入取消响应状态 ATOMIC:创建后,立即开始调度,执行到第一个挂起点之前不响应取消...LAZY:只有被需要,包括主动调用start,join,await等函数才会开始调度,如果调度前被取消协就会进入异常结束状态 UNDISPATCHED:创建之后立即在当前函数的调用栈中执行...,得到想要的结果后要更新UI又可以切换到UI线程上,非常的方便。

22410

Kotlin系列(一)

言归正传,我们在学习一个新东西的时候,如果连这个东西"是什么"都回答不了,那么自然很难进入知识获取阶段的"为什么"和"怎么办"这两个后续环节了。因此,我们首先得知道的定义。   ...二.和线程的联系和区别   联系:和线程都可以实现并发性,允许程序同一间处理多个任务;和线程都可以用于异步编程。   区别:是一种轻量级的线程,运行在线程之上。...线程等待某种资源或者等待I/O操作完成,会被阻塞,并且阻塞的期间还一直霸占着CPU资源。...,会得到返回值:   {体内   运行结束,结果为:Success(Hello Coroutine)}   也就是说,体的返回值会作为resumeWith的参数传入,如本例中就得到Success...,用来处理未捕获的异常   的标准库也为我们定义了一个空的上下文,EmptyCoroutineContext,里面没有任何数据。

19310

即学即用Kotlin -

概念 相信大家或多或少的都了解过,是什么,官网上这么说: “Essentially, coroutines are light-weight threads. 是轻量级的线程,为什么是轻量的?...除了简单的用法外,这里有两个问题得注意一下: collect 函数是一个 suspend 方法,所以它必须发生在或者带有 suspend 的方法里面,这也是为什么一开始的时候启动了 lifecycleScope.launch...lifecycleScope 是使用的 Lifecycle 的扩展库当中的,你可以替换成自定义的作用域。 2....Flow 的消费线程我们启动指定调度器的时候就确认好了,对应着启动的调度器。...将会在下一篇文章中和大家讨论的原理,欢迎大家关注。 学习和 kotlin 还是很有必要的,我们团队开发新的功能的时候,也全部选择了 Kotlin。

1.5K20

破解 Kotlin (3) - 调度篇

可能有朋友还会有疑问,并没有拦截器当中切换线程,为什么从 ③ 处开始有了线程切换的操作?...这里我们用到了 Dispatchers.Main 来确保 launch 启动调度始终调度到 UI 线程,那么下面我们来看看 Dispatchers.Main 的具体实现。...自己的 2015 款 mbp 上对于两种不同的情况分别循环运行 100 次,得到的平均时间如下: 线程数 10 1 耗时ms 1006.00 1004.97 注意,为了测试的公平性,在运行 100...越多的自由,意味着越多的代价,我们 Jvm 上面编写代码需要明白一点的是,线程安全问题在调度器不同的程之间仍然存在。...如果大家代码中使用锁之类的并发工具就反而增加了代码的复杂度,对此的建议是大家在编写代码尽量避免对外部作用域的可变变量进行引用,尽量使用参数传递而非对全局变量进行引用。

73020

中的取消和异常 | 异常处理详解

异常会到达层级的根部,而且当前 CoroutineScope 所启动的所有都会被取消。...△ 中的异常会通过的层级不断传播 虽然一些情况下这种传播逻辑十分合理,但换一种情况您可能就不这么想了。...异常会在它发生的第一间被抛出 Async 当 async 被用作根 (CoroutineScope 实例或 supervisorScope 的直接子) 不会自动抛出异常,而是您调用 .await...这就是为什么没有必要将它也包裹进 try/catch 中,await 将会抛出 async 中产生的所有异常。...内部会在异常出现时传播异常并传递给它的父级,由于父级并不知道 handler 的存在,异常就没有被抛出。 优雅地处理程序中的异常是提供良好用户体验的关键,事情不如预期般发展尤其如此。

1K20

破解 Kotlin - 入门篇

假定你对(Coroutine)一点儿都不了解。 通过阅读本文看看是否能让你明白是怎么一回事。 ? 1. 引子 之前写过一些的文章,很久以前了。...那会儿还是很痛苦的,毕竟 kotlinx.coroutines 这样强大的框架还在襁褓当中,于是乎写的几篇的文章几乎就是告诉大家如何写这样一个框架——那种感觉简直糟糕透了,因为没有几个人会有这样的需求...首先我们通过 launch 启动了一个,这类似于我们启动一个线程, launch 的参数有三个,依次为上下文、启动模式、体: public fun CoroutineScope.launch...上下文有一个重要的作用就是线程切换, Dispatchers.Main 就是一个官方提供的上下文,它可以确保 launch 启动体运行在 UI 线程当中(除非你自己 launch 的体内部进行线程切换...、或者启动运行在其他有线程切换能力的上下文的)。

54220

破解 Kotlin (1) - 入门篇

之前写过一些的文章,很久以前了。...那会儿还是很痛苦的,毕竟 kotlinx.coroutines 这样强大的框架还在襁褓当中,于是乎写的几篇的文章几乎就是告诉大家如何写这样一个框架——那种感觉简直糟糕透了,因为没有几个人会有这样的需求...首先我们通过 launch 启动了一个,这类似于我们启动一个线程,launch 的参数有三个,依次为上下文、启动模式、体: public fun CoroutineScope.launch...上下文有一个重要的作用就是线程切换,Dispatchers.Main 就是一个官方提供的上下文,它可以确保 launch 启动体运行在 UI 线程当中(除非你自己 launch 的体内部进行线程切换...、或者启动运行在其他有线程切换能力的上下文的)。

77800

中的取消和异常 | 取消操作详解

调用 cancel 方法 当启动多个协,无论是追踪状态,还是单独取消各个协,都是件让人头疼的事情。...底层实现中,子会通过抛出异常的方式将取消的情况通知到它的父级。父通过传入的取消原因来决定是否来处理该异常。...不能在已取消的作用域中再次启动新的 如果您使用的是 androidx KTX 库的话,大部分情况下都不需要创建自己的作用域,所以也就不需要负责取消它们。...例如,当 ViewModel 被清除,在其作用域内启动也会被一起取消。 为什么处理的任务没有停止? 如果我们仅是调用了 cancel 方法,并不意味着所处理的任务也会停止。...为什么会拿到这个异常呢?

2K20

【Kotlin 启动 ④ ( 启动模式 | 构建器启动模式参数 | DEFAULT 模式 | ATOMIC 模式 | LAZY 模式 | UNDISPATCHED 模式 )

* 得到与其他语言中的类似原语相比有一个关键的区别 * 和框架:它取消父作业(或外部作用域)执行*结构化并发*范式失败。...* * 启动选项的汇总如下: * * [DEFAULT]——根据上下文立即安排执行; * * [LAZY]—只需要启动; * * [ATOMIC]——原子地(以不可取消的方式)...* * 如果[Job]它甚至有机会开始执行之前被取消,那么它将不会启动它的 * 执行,但将以异常完成。...*/ DEFAULT, /** * 只有需要才会惰性地启动。...* * 如果[Job]它甚至有机会开始执行之前被取消,那么它将不会启动它的 * 执行,但将以异常完成。

95510

python1:yield的使用

看了一章,做个读书笔记,加深印象。 定义 的底层架构是pep342 中定义,并在python2.5 实现的。...函数,因为生成器还没有启动,没有yield语句处暂停,所以开始无法发送数据 # 发送 None 可以达到相同的效果 my_coro.send(None) next(my_coro)# 此时处于...(my_coro2) 得到结果为 GEN_SUSPENDED (处于暂停状态) my_coro2.send(99) # 把数字99发送给暂停,计算yield 表达式,得到99,然后把那个数赋值给...中,为处理的异常会向上冒泡,传递给next函数或send方法的调用方,未处理的异常会导致终止。....throw(...)和.close() 方法控制 下一部分将介绍: 终止如何返回值 yield新句法的用途和语义 最后,感谢女朋友支持。

71730

“新”for me,2022一起来看看这些技术

什么是“好”的技术,为什么“火” 前言:这个是个人观点,技术要用在合适的业务场景中才能体现出它的优势,而不是盲目的去学,去看 解决现今开发的技术痛点 回调地狱,切换线程等功能 a()//耗时任务...选用合适的数据结构, 选用合适的算法,切合实际场景的设计模式 譬如中存储上下文的数据结构(链表),异常处理机制中用到的树的结构......等等(为什么这个这么少呢,因为只学到了皮毛....)...丰富的api 中很多api使用的时候如果不了解它里面的一些原理机制,出现问题的几率是非常大的......这是为什么呢?这里涉及到异常取消机制了。 中创建了子后,会默认建立父子关系。当父取消后,需要把它所有的子全部取消掉,才算取消完成。...认为的技术趋势在这里: 没错,就是上面讲的那两个哈哈: 插件化 最后,前几天群里看到大佬说的一句话觉得不错,分享给大家: 技术是不断变化的,卷是不变的。

19820
领券