Hi 各位好,又到了我们一年一度的 iT邦铁人赛的挑战,这次我所挑战的主题是 Kotlin 中用来处理非同步的 lib Coroutine,中文名称「协程」,是与 Kotlin 1.3 版一起推出的一个函式库,正式版推出时间距今已经快要有三年的时间,目前在 github 也已经累积 9.7k 颗星。
Coroutine 推出之後,很多 Kotlin 开发者开始使用 Coroutine,究竟 Coroutine 有什麽样的魅力,可以让 Kotlin 开发者对 Coroutines 趋之若鹜呢?
在三十天中,我们将会一一讨论 Coroutine,包括 CoroutineScope、Coroutine Builder、Suspend function、channel、flow... 。
在开始进行 Coroutine 的讨论之前,我们要先来了解 Coroutine 是要用来解决什麽问题。(文末解答XD)
首先,根据程序的执行顺序可以分为两种形式,一种是同步 (Synchronous)的、另一种为非同步(Asynchronous),也称为异步。
同步是根据程序码的顺序来执行。同步的程序是容易的、直觉的,只要将程序码按照想要执行的顺序依序编写就可以了。
如上, 用同步的方式依序执行三段程序,程序的执行时间就会是 function A 所执行的时间+ function B 所执行的时间 + function C 所执行的时间。一段程序执行完之後,才会执行下一段程序。
这就像是田径场上的接力赛的感觉,一棒接一棒。
非同步的概念则是与同步相异,程序码不是依照程序码的顺序来执行并得到结果。当需要执行的程序需要比较多的时间,为了避免卡住画面,会将程序码在另外的执行绪上执行,等到完成之後告诉主执行绪、又或者是不知道什麽时候可以取得结果(例如与 Server 取值)。
如下图,向 Server 取值的时序图:
当 Client 向 Server 发出一个请求时,因为是采用非同步的方式执行,所以在发出请求之後,还可以做其他的操作,Client 不会卡在那边等 Server 的值回传。
若改用同步的方式来实现,执行时序图如下:
可以发现,如果采用同步的方式来取 Server 的值,假设 API 需要花费比较长的时间才会得到结果,那麽用户端就会卡在那边,等待 Server 的回传值,更不用说如果等待的时间拉长,会严重影响使用的体验。在 Android 上,只要主执行绪 (Main Thread) 停住五秒钟以上,就会显示 ANR (Application Not Response)来警告使用者。
所以当执行这些结果不是立刻取得的任务时,为了避免不会因执行太久、等待太久而导致使用者使用体验不好,我们会使用非同步的方式来处理。
简单来说,非同步的概念就是我请别人帮忙做事,别人做完之後再通知我。那麽这样子就不会占用到主执行绪,当然如果非同步执行的程序需要花费很多时间,非同步应该要可以随时被停止,Coroutine 在这一点就做得蛮好的。
除了耗时任务以外,有些时候我们需要延迟执行我们的程序,也就是说当我们呼叫的时候这段程序码不会立刻执行,而是等待一段时间才继续执行,并回传结果,
介绍了同步以及非同步的差异,聪明的读者你应该已经猜到了,没错,Coroutine 就是用来解决非同步的种种问题。
Kotlin Taiwan User Group
Kotlin 读书会
<<: 从零开始学习3D游戏开发:程序基础 Part.3 回圈
>>: .Net Core Web Api_笔记06_HTTP资源操作模式Head
最近设计一个回圈收发电文 步骤大概为 1.与公司主机建立连线 2.收取公司电文讯息 3.发出自建电文...
本周的目标是要让横向卷轴中的角色可以左右移动及跳跃, 在没有碰到场景物件时自由落体, 碰到墙壁时被...
我们继续透过 LeetCode #1 Two Sum 来实际感受解决问题的过程 ( 题目连结 ) 一...
突然意识到,其实正确的学法,应该更直接去看看别人怎麽做。 立刻发现,ProtoPie 已经整理了一些...
Swift 语法介绍 枚举(Enumerations) ,类和结构体 枚举(Enumerations...