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

破解 Kotlin 协程(5) - 协程取消篇

NullPointerException("ResponseBody is null.")) } }) } 我们这里用到了 suspendCancellableCoroutine,不是之前的...Deferred 可以当做一个子协程,它应当遵循默认的作用域规则,在父作用域取消时被取消掉,但现实却并不是这样: 13:06:54:332 [DefaultDispatcher-worker-1] 1...Deferred 并没有被取消,再仔细一看,时间上这个回调比前面的操作晚了 2s,那必然是网络请求返回之后才回调的。...如果 cancel 抛异常没有捕获的话,那么等同于协程体内部抛出异常,具体如何传播看所在作用域的相关定义了。...再稍微提一句,协程不是一个简单的东西,毕竟它的原理涉及到对操作系统调度、程序运行机制这样程序界毕竟原始的话题,但你说如果我对前面提到的这些都不是很熟悉或者根本没有接触过,是不是就要跟协程拜拜了呢,其实也不是

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

Kotlin 程序设计》第十二章 Kotlin的多线程

Kotlin 的设计中的关键特性是协程执行的实现是语言库的一部分, 不是语言的一部分,所以你不必绑定任何特定的编程范式或并发库。 协程实际上是一个轻量级的线程,可以挂起并稍后恢复。...: error("keyword not found") 当你有一个可调用的引用不是 lambda 时,使用也很方便: <div class="sample" markdown="1" data-min-compiler-version...如果该映射是用 withDefault 生成的,这个函数将返回默认值,不是抛异常。...如果你需要访问新的 API,请使用 kotlin-stdlib-jre7 和 kotlin-stdlib-jre8 maven 构件,不是标准的 kotlin-stdlib。...请注意,核心反射接口(如 KClass)是 Kotlin 标准库 (不是 kotlin-reflect)的一部分,不受移动影响。

3.2K10

【翻译】深入 Kotlin 协程

线程上启动一个网络请求是不明智的做法(在安卓上这甚至不可能,因为你的应用程序会抛出一个丑陋的 NetworkOnMainThreadException 异常),由于网络请求经常会花费至少半秒的时长,此期间...在 C# 中 async 和 await 都是关键字 在 C# 中 async 函数只能返回一个 Task 实例或者返回空 如果你仔细观察协程的这个例子,你会看到在 Kotlin 中, launch{}...通常,一个协程坐落在一个实际的线程池当中,专门用于后台任务的执行操作,这也就是协程为什么如此高效的原因。它只会在需要的时候才会使用系统资源。...一个 OutOfMemoryException 内存溢出的异常在没有使用协程而是大量线程运行下很容易发生,这并不是什么新鲜事了。 原理是什么? 让我们看一下 async{} 函数的签名是什么样子的!...通过使用 CoroutineStart.LAZY 这个值,可以让协程只在开发者显式调用返回Deferred 实例或者 Job 实例的 await() 方法或者 join() 方法才开始运行。

1.4K10

深入浅出Kotlin协程

协程和线程,进程不同,它通常不是由操作系统底层直接提供支持,而是通过应用层的库来实现,譬如Kotlin的协程,其实就是依赖java/android的线程/线程池再加上一些对上下文的控制逻辑来实现的。...仅仅从概念层面去讲也可以总结出几条: 因为某些协程库的实现使用了任务分发(比如Kotlin),于是可以在协程函数(也就是Kotlin coroutine中的suspend方法)中无限递归调用自身不会栈溢出...在于返回值,async返回的是一个Deferred对象,可以通过await来同步获取执行结果。...) { with(cont) { resumeUndispatched(Unit) } } } 这里可以看到,DelayedResumeTask的Continuation处理的不是返回值...= coroutine_suspended) { return coroutine_suspended; } System.out.print(String.valueOf

11.5K113

破解 Kotlin 协程(1) - 入门篇

@GET("users/{login}") fun getUser(@Path("login") login: String): Deferred } 注意 Deferred 是 Job...那么我们需要为 Retrofit 添加对 Deferred 的支持,这需要用到开源库: implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter...这看上去有些费解,因为直觉告诉我们,getUser 返回了一个 Deferred 类型,它的 await 方法会返回一个 User 对象,意味着 await 需要等待请求结果返回才可以继续执行,那么 await...4.2 suspend 函数的方式 suspend 函数是 Kotlin 编译器对协程支持的唯一的黑魔法(表面上的,还有其他的我们后面讲原理的时候再说)了,我们前面已经通过 Deferred 的 await...协程可以帮你优雅的处理掉这些。

77900

破解 Kotlin 协程 - 入门篇

@GET("users/{login}") fun getUser(@Path("login") login: String): Deferred } 注意 Deferred 是 Job...那么我们需要为 Retrofit 添加对 Deferred 的支持,这需要用到开源库: implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter...这看上去有些费解,因为直觉告诉我们, getUser 返回了一个 Deferred 类型,它的 await 方法会返回一个 User 对象,意味着 await 需要等待请求结果返回才可以继续执行,那么...4.2 suspend 函数的方式 suspend 函数是 Kotlin 编译器对协程支持的唯一的黑魔法(表面上的,还有其他的我们后面讲原理的时候再说)了,我们前面已经通过 Deferred 的 await...协程可以帮你优雅的处理掉这些。

54220

Kotlin】协程(一)——入门

那么是不是可以用协程来开启一个异步操作?切换线程? 答案是肯定的,不仅可以做到,而且写起来也很简单。下面看个栗子 栗子 举个例子,这里有个登录操作,需要用两个接口才能完成。...使用 知道到了他的优(niu)秀(bi)之处,下面来看看是怎么用的 因为是Kotlin的协程,所以项目需要支持Kotlin。怎么支持就不用我说了吧? (不要问我,我不会,因为那是另一个同事做的。...那我再里面做耗时操作,是不是会卡住?" ? 确实,如果直接这样用是会阻塞主线程的。所以这时候,就需要用到withContext() mainScope这个作用域内的调度器是基于主线程调度器的。...withContext withContext():用给定的协程上下文调用指定的暂停块,暂停直到完成,然后返回结果。也就是说,可以用来切换线程,并返回执行后的结果。...不同的是他可以返回协程执行结束后值。 async()返回的是一个Deferred对象,需要通过Deferred#await()得到返回值。

1.3K20

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

今年的 Google IO 也放出了 Kotlin First 的口号,许多新的 API 和功能特性将优先提供 Kotlin 支持。所以,时至今日,实在找不到安卓开发者不学 Kotlin 的理由了。...今天想聊聊的是 Kotlin Coroutine。...但是当你执行这个方法之后,立即按返回返回上一页面,仍然会弹出 Toast 。如果是实际开发中通过网络请求更新页面的话,当用户已经不在这个页面了,就根本没有必要再去请求了,只会浪费资源。...示例代码如下所示: val mResult: LiveData = liveData { val string = getMessage("LiveData Ktx")...emit(string) } 你可能会好奇这里好像并没有任何的显示调用,那么,liveData 代码块是在什么执行的呢?

2.7K30

Kotlin中的协程及在Android中的应用

Deferred。...提前说一下async和launch的区别: async函数体中最后一行代码表达式运行结果会作为结果返回,也就是Deferred中的泛型T,我们可以通过其他协程函数获取到这个执行结果,launch没有这样的返回值...最常见的,网络请求在IO线程,页面更新在主线程。 Kotlin给我们提供了一个顶层函数withContext用于改变协程的上下文并执行一段代码。...Job,async的返回结果是一个DeferredDeferred其实是Job的子类。...DEFAULT默认启动模式,协程创建后立即开始调度,注意是立即调度不是立即执行,可能在执行前被取消掉。 LAZY懒汉启动模式,创建后不会有任何调度行为,直到我们需要它执行的时候才会产生调度。

11910

【翻译】忘了RxJava吧——你需要的是拥抱Kotlin协程(Part 12)

【翻译】忘了RxJava吧——你需要的是拥抱Kotlin协程(Part 1/2) 2018-08-31 by Liuqingwen | Tags: Kotlin Android 翻译 |...一、前言 我非常喜欢 Kotlin ,也非常喜欢 Kotlin Coroutines 协程,在看到了这篇文章后心里真是激动啊!于是乎——就有了这篇谷歌自动人工翻译,以飨观众!希望大家喜欢。哈哈。...如果Kotlin Coroutines可以让我们的生活更美好,那会怎么样? 首先让我们来看下我们是否可以替换 Single 这个对象。在协程的世界里,最合适的对象就是 Deferred 接口了。... fun getRepositories(reposUrl: String, auth: Authorization) : Deferred<List<GithubRepository...我们可以在我们的业务逻辑对象中抛弃任何包装器,不需要返回 Deferred 包装对象,假装没有任何实际的异步操作发生。

1.1K20

kotlin 协程入门教程

明白这一点后,你可能会问,为什么kotlin要重复造轮子,java线程池不好吗?kotlin协程相对于我们使用java线程池有什么优势吗?...为什么不直接使用Java线程池 这里需要提前说明一下,kotlin 协程封装的线程池与 java 的线程池是不一样的。...大概的原理如下图所示: 可以看到,Java线程池的实现是通过阻塞队列存储任务,然后线程不断地执行任务; kotlin 的线程池,则是线程中存储任务,kotlin线程池负责调度任务。...这里重要的不是语法糖,而是 suspend ,它表明该函数是挂起函数。...Deferred 是 Job 的子类 //相比 Job 多了 await 方法来获取协程的返回值 val deferred: Deferred = scope.async { ... } 获取到

13310

一篇文章揭开Kotlin协程的神秘面纱

前言 Kotlin协程提供了一种新的异步执行方式,但直接查看库函数可能会有点混乱,本文中尝试揭开协程的神秘面纱。 理论 它是什么 这是别人翻译: 协程把异步编程放入库中来简化这类操作。...程序逻辑在协程中顺序表述,底层的库会将其转换为异步操作。库会将相关的用户代码打包成回调,订阅相关事件,调度其执行到不同的线程(甚至不同的机器),代码依然想顺序执行那么简单。...实战协程 在大多数情况下,我们需要来自一个异步执行的回调,这样我们就可以通过回调函数来更新UI等,这里就可以使用Deferred语法: Deferred本身继承扩展了Job,但增加一个额外的功能,它可以在函数完成执行后返回未来的值...我们通过async异步创建了另一个协同程序,其中包含我们需要调用的函数,唯一的区别是:这个协程返回一个Deferred值,async是协程库的一部分。 3....我们调用await()函数来捕获Deferred的未来值。这是在UI所在线程上下文中捕获的。 总而言之,我们创建了一个异步执行程序,我们可以在其中传递函数并让它们异步执行,然后将值返回给UI线程。

39431

再谈协程之CoroutineContext我能玩一年

❞ CoroutineContext接口的API一开始可能看起来很晦涩,但实际上它只是一个类型安全的异构map,从CoroutineContext.Key实例(根据类的文档,通过引用不是值进行比较,也就是说...为了理解为什么必须重新定义一个新的接口,不是简单地使用一个标准的Map,我们可以参考下面这样一个类似的等效申明。...这不是一个类型,也不是一个类,而是个伴生对象。...这是一个设计上的选择,这样在这个作用域上调用的所有coroutine构建器将使用Main dispatcher不是Default。...是在作用域上调用的(不是一个顶级函数),它将继承作用域的dispatcher,这里被指定为Dispatchers.Main,不是使用默认的dispatcher。

60910
领券