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

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

关键词:Kotlin 异常处理 异步代码的异常处理通常都比较人头疼,而则再一次展现了它的威力。 1....它更适合一系列对等的并发的完成一项工作,任何一个子异常退出,那么整体都将退出,简单来说就是”一损俱损“。这也是内部再启动子的默认作用。...来捕获这个异常的,这再一次表明把异步的异常处理到同步代码逻辑当中。 那么如果我们把 coroutineScope 换成 supervisorScope,其他不变,运行结果会是怎样?...,1-8 的输出其实没有本质区别,顺序的差异是线程调度的前后造成的,并不会影响语义。...join 和 await 的不同:join 只关心是否执行完,await 则关心运行的结果,因此 join 在出现异常时也不会抛出该异常,而 await 则会;考虑到作用的问题,如果抛异常

1.3K10

破解 Kotlin (8) - Android 篇

CoroutineScope 用起来没什么不一样的地方,通过同一个叫 mainScope 的实例启动的,都会遵循它的作用定义,那么 MainScope 的定义时怎样的?...这里需要小心的是如果使用了一些没有依赖作用的构造器,那么一定要小心。...,我们就会收到 cancel 的指令,尽管这种情况下的执行不会跟随 Activity 的 onDestroy 而取消,但它与 View 的点击事件紧密结合,即便 Activity 没有被销毁,...,结果返回时会帮我们切回到主线程——这非常类似 Nodejs 这样的单线程工作模式。...一旦我们作用规则以及与 UI 生命周期的关系熟稔于心,那么相信大家使用时一定会得心应手的。

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

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

它可以将程限制在一个特定的线程执行,也可以把分配到一个线程池,或者不受限制约束的进行运行上下文对象:CoroutineContext。...因此它与这个启动的作用无关且独立运作。...但是子仍然处于活动状态,那么整个协就仍然属于活动状态。 当然,我们如果主动调用.cancel() 那么没有运行完也会被强制结束了。 这就是中的父子程之间的关系了。...初始时,多元素添加 我们学过载中初始化调度器,在上一步也学习了添加名称。 那么我们如果在启动的时候这两个配置属性都要进行添加,那么如何处理? 可以通过+进行拼接。...Android 现在在所有具有生命周期的实体中(activity,Fragment等),都对作用提供了一级支持。 局部数据传递 我们如果使用,特别是子,父混杂等等情况。

31210

破解 Kotlin (5) - 取消篇

那么问题来了,这里并没有告诉它父究竟是谁,因此也就谈不作用的事儿了,这好像我们用 GlobalScope.launch 启动了一个一样。...4.2 如何正确的将回调转换为 前面我们提到既然 adapt 方法不是 suspend 方法,那么我们是不是应该在其他位置创建?...如果 cancel 抛异常而没有捕获的话,那么等同于体内部抛出异常,具体如何传播看所在作用的相关定义了。...最后我们还分析了一下 Retrofit 的扩展的一些问题和解决方法,这个例子也进一步可以引发我们作用以及如何将现有程序化的思考。...再稍微提一句,不是一个简单的东西,毕竟它的原理涉及到对操作系统调度、程序运行机制这样程序界毕竟原始的话题,但你说如果我对前面提到的这些都不是很熟悉或者根本没有接触过,是不是就要跟拜拜了,其实也不是

1.7K50

Kotlin解析系列():调度与挂起

本质是轻量级线程的特点有: 可以异步代码同步化,其本质是轻量级线程。 可在单个线程运行多个协,其支持挂起,不会使运行线程阻塞。 可以降低异步程序的设计复杂度。...Kotlin实现层次: 基础设施层:标准库的API,主要对提供了概念和语义最基本的支持; 业务框架层:的上层框架支持,基于标准库实现的封装,也是我们日常开发使用的扩展库。...启动需要作用,但是作用又是在创建过程中产生的。 图片 官方提供的常用作用: runBlocking: 顶层函数,可启动,但会阻塞当前线程 GlobalScope 全局作用。...5.2 suspend本质 Kotlin 使用堆栈帧来管理要运行哪个函数以及所有局部变量。 在常规函数基础添加了suspend和resume两项操作用于处理长时间运行的任务。...下面一起回顾一下全文重点内容,对全文内容进行一个总结 引入: 可以异步代码同步化,降低程序涉及的复杂度 本质是轻量级线程,单个线程可以运行多个协运行不会导致线程阻塞 启动:

1.7K40

在 Android 开发中使用 | 上手指南

通过在常规函数之上增加 suspend 和 resume 两个操作来解决上述问题。当某个特定的线程的所有被 suspend 后,该线程便可腾出资源去处理其他任务。...在 launch 函数体内,您可以调用 suspend 函数并能够像我们一篇介绍的那样保证主线程安全。 Launch 是将代码从常规函数送往世界的桥梁。...也就是说,如果某个协启动了另一个新的,它们都会在同一个 scope 中终止运行。...这段代码中,我们在 coroutineScope 构造器中使用 launch 启动了一千个,您可以看到这一切是如何联系到一起的。...实现这种结构化并发,会为我们的代码提供一些保障: 作用取消时,它内部所有的也会被取消; suspend 函数返回时,意味着它的所有任务都已完成; 报错时,它所在的作用或调用方会收到报错通知。

1.4K20

Kotlin系列(一)

二.线程的联系和区别   联系:线程都可以实现并发性,允许程序在同一时间处理多个任务;线程都可以用于异步编程。   区别:是一种轻量级的线程运行线程之上。...而的挂起是不会阻塞线程的,运行在这个线程的其他还会照常执行,并且挂起时会主动释放自己的CPU资源。...三.Kotlin的基础设施   Kotlin实现分为两个层次: 基础设施层:标准库的API,主要对提供了概念和语义最基本的支持 业务框架层:的上层框架支持,也就是在基础设施层的基础再封装一层...,在体内我们可以直接使用作用内提供的函数或者状态等。   ...那么我们最关心的问题来了,如何处理线程的调度?

19610

Kotlin 看这一篇就够了

前言 Kotlin是什么,如何使用?如何结合Retrofit使用?Kotlin的优势在哪里?相信看完这一篇你一定有所收获!...,如果请求很多的话,第一 代码结构会很难看,第二 写着写着就很乱了,那么就可以很好的解决这个问题,下面我们来看使用的方式 怎么写....首先,对于一个耗时的操作,我们需要将他切换到后台线程执行,withContext函数可以构建一个作用,他必须在挂起函数或者中执行,suspend关键字是kotlin我们提供的 用于标记挂起函数的关键字...上面代码看起来没有什么问题,如果我们用到了mvp模式什么的,便于职责单一,还要单独放一个类中,这样就需要添加回调才能获取返回结果。 那么中怎么使用?...创建的作用的代码没有执行完毕前会一直阻塞线程,所以上面。

1.4K10

干货 | KotlinNative 异步并发模型初探

Kotlin/JVM 的既能完成异步请求,也能完成并行计算,并且由于中拥有挂起(suspend),Kotlin/JVM 就可以在而非线程的层面上来解决并发竞争的问题。...即当并发竞争出现的时候,这套机制只需将挂起而无需阻塞线程,而对于是否发生竞争的判断可以转移到原子操作。...所以我预先猜测的是,如果没有发生事实的多线程竞争,程序会正常运行,但是一旦发生多线程竞争,程序会抛出异常并崩溃。...但是当前预览版本的多线程中仍然没有线程池的实现,因此我们必须手动创建其他的多线程上下文。...从长远来看,-挂起机制是 Kotlin 的核心,如果后续 kotlinx.io库完整实现了基于 suspend 的 I/O,那么就可以一统Kotlin 的所有异步并发场景,因此,Worker-

1.6K20

Android的7个必要知识点

上下文与调度器: 理解上下文的概念,包括调度器(Dispatcher)的作用如何在不同的线程执行代码。 挂起函数: 掌握挂起函数的概念,以及如何中调用和编写挂起函数。...作用: 理解作用的概念,如何管理多个协的生命周期和范围。 并发与顺序性: 学会使用来处理并发任务和顺序性操作,以及如何组合多个协的执行流程。...Kotlin Coroutine引入了作用的概念,帮助我们更好地管理多个协的执行以及确保资源的正确释放。 什么是作用?...创建作用Kotlin中,我们可以使用CoroutineScope来创建作用。...通过使用launch函数,我们可以在不同的中同时执行多个任务,而这些可以在相同的作用运行,继承相同的上下文和调度器。

44941

Kotlin知识累计

的async异步 和协的 launch是相似的,只是它启动了一个单独的,这是一个轻量级的线程并与其它所有的一起并发的工作。...大写的CoroutineScope与小写的coroutineScope的区别:小写的coroutineScope叫做构建器,里面自带继承父的上下文作用,而大写的作用是自定义设置的上下文作用...6、Flow流:是冷流,就是 Kotlin 与响应式编程模型结合的产物,你会发现它与 RxJava 非常像,用于替代RxJava。...既然都是共享内存那和我们自己使用共享内存有什么区别?所以更为准确的说法是为什么我们使用发送消息的方式来同步信息,而不是多个线程或者直接共享内存?...1.首先,使用发送消息来同步信息相比于直接使用共享内存和互斥锁是一种更高级的抽象,使用更高级的抽象能够为我们在程序设计提供更好的封装,程序的逻辑更加清晰; 2.其次,消息发送在解耦方面与共享内存相比也有一定优势

16510

如何正确的在 Android 使用

那么,在 Android 中应该如何正确使用?再细分一点,如何直接在 Activity 中使用如何配合 ViewModel 、LiveData 、LifeCycle 等使用?...在 Android 的使用 GlobalScope 在一般的应用场景下,我们都希望可以异步进行耗时任务,比如网络请求,数据处理等等。当我们离开当前页面的时候,也希望可以取消正在进行的异步任务。...大致意思是,Global scope 通常用于启动顶级,这些在整个应用程序生命周期内运行,不会被过早地被取消。程序代码通常应该使用自定义的作用。...MainScope 官方文档中提到要使用自定义的作用,当然,Kotlin 已经给我们提供了合适的作用 MainScope 。...那么如何在 ViewModel 中定义作用?还记得上面 MainScope() 的定义吗?没错,搬过来直接使用就可以了。

2.7K30

写给Android工程师的指南

如果将上述概念带入到线程中,当一个线程执行时,它会一直运行,直到被操作系统强制中断或者自己放弃CPU;而的协作式则需要程之间互相配合协作,以便其他也可以获得执行机会,通常情况下,这种协作关系是由应用层...那Kotlin? 在上面,我们说了 线程 ,但这个协指的是 广义 这个概念,而不是 Kotlin ,那如果回到 Kotlin ?...相应的,Kotlin 具有以下特点: 轻量:您可以在单个线程运行多个协,因为支持挂起,不会使正在运行线程阻塞。挂起比阻塞节省内存,且支持多个并行操作。...对于挂起函数而言,在是否真的被挂起,通过函数返回值来确定,但相应的,如果我们有挂起函数需要具备返回类型?那如果该函数没有挂起?...yield()时,该方法就会判断当前作用是否已经不在活跃,如果满足条件,则直接抛出 CancellationException 异常。

1.3K40

kotlin 入门教程

除此之外,当其中一个线程没有任务时,kotlin线程池则会尝试分发其他线程的任务给空闲线程。至于这么做有什么好处,官方给的答案是以最有效的方式在工作线程分发已调度的任务。...的组成部分 kotlin框架主要由三部分组成:CoroutineScope(作用)、CoroutineContext(上下文)、挂起函数。下面我们分别来介绍。...CoroutineScope(作用) 前面简单介绍过,CoroutineScope 是作用,主要作用是用来追踪,方便我们批量地控制。...CoroutineScope 可以分成两种: GlobalScope,是指全局作用,通过它创建的可以一直运行直到应用停止运行。...Job 结束运行 deferred.await() //阻塞等待直到获取的执行结果 前面我们提到过,kotlin 的一大特点就是结构化并发。

13210

Kotlin中的及在Android中的应用

Kotlin的一个可以理解为是运行线程的一个执行任务并且该任务可以在不同的线程间切换,一个线程可以同时运行多个协。...GlobalScope的调度器是Dispatchers.Default,那么我们如何改变?...()) } 那如果我们想在运行中改变线程怎么办?...最常见的,网络请求在IO线程,而页面更新在主线程Kotlin我们提供了一个顶层函数withContext用于改变的上下文并执行一段代码。...那么Job是什么启动以后,我们可以得到一个Job对象,通过Job对象我们可以检测的生命周期状态,并且可以操作协(比如取消协)。 我们可以大致把Job理解为本身。

11410

在 Android 开发中使用 | 背景介绍

所以想应用运行不 “卡”、做到动画能够流畅运行或者能够快速响应用户点击事件,就得那些耗时的任务不阻塞主线程运行。 要做到处理网络请求不会阻塞主线程,一个常用的做法就是使用回调。...这些会导致执行时间长从而用户感觉很 “卡” 的操作都不应该放在主线程执行。 使用 suspend 并不意味着告诉 Kotlin 要在后台线程执行一个函数,这里要强调的是,会在主线程运行。...如果需要处理一个函数,且这个函数在主线程执行太耗时,但是又要保证这个函数是主线程安全的,那么您可以 Kotlin 在 Default 或 IO 调度器执行工作。...在 Kotlin 中,所有都必须在调度器中运行,即使它们是在主线程运行也是如此。可以自行暂停,而调度器负责将其恢复。...如果您在写代码的过程中也遵循这一点,那么您的代码将会变得非常简单,并且不会将线程问题与应用逻辑混杂在一起

1.5K30

Kotlin实现原理:Suspend&CoroutineContext

今天我们来聊聊KotlinCoroutine。 如果你还没有接触过,推荐你先阅读这篇入门级文章What? 你还不知道Kotlin Coroutine?...如果你已经接触过,相信你都有过以下几个疑问: 到底是个什么东西? 的suspend有什么作用工作原理是怎样的?...解释了这么多,最后我们还是直接点,来看下它的优点 轻量:您可以在单个线程运行多个协,因为支持挂起,不会使正在运行线程阻塞。挂起比阻塞节省内存,且支持多个并行操作。...内存泄露更少:使用结构化并发机制在一个作用内执行多个操作。 内置取消支持:取消功能会自动通过正在运行层次结构传播。 Jetpack集成:许多 Jetpack 库都包含提供全面支持的扩展。...有了这个基础,我们再看它的get方法就很清晰了。先从element中去取,没有再从之前的left中取。 那么这个Key到底是什么

1.7K10

再谈程之viewmodel-livedata难兄难弟

前言 ViewModel和LiveData最早是Google提出的AAC架构中的重要成员,那么它为什么又和协扯上关系了?...如果没有怎么接触Flow,那么看完这篇文章,你可能也会对LiveData鸣不平,确实,Flow提供了类似RxJava强大的异步数据流处理能力,注意,这里说的是「异步数据流」,什么是异步数据流?...除此之外,为了利用的结构化并发,ViewModel提供了viewModelScope来作为默认的可控生命周期的作用,所以,我们通常会抽象出一个ViewModel基类,封装viewModelScope...,这就是LiveData的作用,当LiveData被注册的时候,作用域中的代码就会被执行,而当LiveData不再被使用时,里面的操作就会因为结构化并发而取消。...ViewBinding,ViewModel,LiveData,,异常捕获,生命周期控制有机的融合到了一起,作为一个OneShot的UI界面,我们在极简代码的基础,实现了良好的分层架构。

1.1K40

Kotlin 程之Practice

Kotlin 作用 线程主动释放CPU是一个作用,一个执行后挂起,然后另一个执行, 等到这个协执行完毕再让前一个继续执行。...可以不依赖于线程直接运行在进程中; 通过提升CPU的利用率,进而减少线程切换,进而提升程序运行效率; 启动与停止都是由代码操作,而不是操作系统调度; Kotlin 练习 Kotlin 练习参考...它启动了一个新的作用并且在所有子执行结束后并没有执行完毕。     ...,上下文包括一个调度器,它确定相应的在执行时使用一个或多个线程调度器会执行在指定的局部线程中,调用它     //运行线程池中或者不受它限制运行     fun testDispatcher...,那么它所有的子也会取消,使用GlobalScope来启动一个它与作用无关且独立启动     /**      * 输出      *  job1: I run in GlobalScope

1.1K20
领券