协程可以解决什么问题?
Kotlin协程引入了一种全新的并发编程模式。它可以被用在Android应用开发上,并达到简化异步代码的目的。虽然协程是从Kotlin 1.3才被引入的,但协程的概念自编程语言问世以来就已经存在了。第一种支持协程的编程语言是1967年推出的Simula。
在过去的几年中,协程变得越来越流行。现在,许多流行的编程语言,如Javascript、C#、Python、Ruby和Go等,都已经支持协程。
在Android平台上,协程可以很好地解决以下两个问题:
- 长时间运行的任务是需要很长的时间才能完成并且会阻塞主线程的任务;
- 主线程安全允许开发者可以从主线程调用任何suspend函数。
接下来,就让我们深入分析协程是如何解决上述两个问题的。
长时间运行的任务
获取网页或与远程API交互都需要发出网络请求。同样,从数据库读取数据或从磁盘加载图片都需要读取文件。这些就是我所说的长时间运行的任务。这些任务花费的时间太长,以至于应用程序不能停下来等待它们的完成。
与网络请求的延时相比,现代手机执行代码的速度要快得多。在Pixel 2手机上,单个CPU周期耗时不到0.0000000004秒。但是,一个网络请求大约耗时400毫秒(0.4秒)。在等待一个网络请求返回的过程中,CPU可以执行超过十亿个周期!
在Android系统中,每个应用程序都有一个主线程,负责绘制界面和处理用户交互。如果在主线程上进行的工作太多,那么应用程序就会变得卡顿,从而产生不良的用户体验。任何长时间运行的任务都应该在不阻塞主线程的前提下运行,从而避免卡顿和无法响应用户触摸事件的情况。
为了避免在主线程上执行网络请求,最常见的实现方式是回调。回调为程序库提供了一个句柄,使得它可以在将来某个时间点通过这个句柄来执行回调代码。通过回调获取一个网页的代码如下:
class ViewModel: ViewModel() {
fun fetchDocs() {
get("developer.android.com")