白话kotlin:用协程来愉快的处理异步问题
Coroutine(协程)是什么玩意?
协程名字听起来很玄乎,其实他是很简单的。
所谓协程,就是相互协作的程序。
为了做好一件事情,我们的程序要相互协作!
一个协程代表着:几段互相帮助,互相协作的代码。
举个简单的例子:
在Android中,我们在ui线程中做与界面相关的操作。
但我们经常会遇到磁盘的读写,网络的请求,这些繁琐耗时的操作我们是在另外一个线程的处理,等这些操作完成后,我们再把结果显示到界面上。
以上就是一种协作,总结下:
- ui线程把耗时操作的代码块交给其他线程来处理
- 其他线程处理处理完成后,把结果交付给ui线程显示
其实以上的例子就是所谓的异步问题
如何处理异步问题?
有很多种方法:
- 开启一起线程处理
- 利用AsyncTask
- 利用CallBack
- 利用RxJava
以上方法本质上都是在另外一个线程处理耗时的操作,只是写法上一个比一个先进一点,人性化一点。
OK,协程可以更加人性化,写出来的代码更加人性化一些,很直观的看出哪些代码在互相协作,看下面的对比:
协程 vs 回调
1. 异步计算
2. 异步UI
看了上面的例子,是不是感觉:
协程中最大的特色:将异步代码写的干净清晰!
协程的基本使用
-
启用一个协程
-
启用一个可阻塞当下线程的协程
-
主动去等待一个协程完成
-
重构,将代码组织进一个函数内,这个函数被 suspend修饰
-
其他:
- 协程是可以被取消的和超时控制
- 可以组合被挂起的函数
- 协程中运行环境的指定,也就是线程的切换
具体的文档在这里:https://github.com/Kotlin/kotlinx.coroutines/blob/master/coroutines-guide.md
协程的内部是如何工作的?
以下只是简单的说一说,来自官网
协程在编译阶段就完成了,它不需要虚拟机或者os的支持。
协程里面被挂起的任务是通过代码转换而成的。
每个可被挂起的函数,被增强为一个状态机:这个状态机记录当前函数所处环境的状态,若这个函数执行完毕,状态机依据当前的状态恢复被挂起之前的环境。
建议看下我的这篇文章:同步编程 vs 异步编程
关于协程中的API
kotlin中的协程目前还处于试验性阶段。
kotlin标准库提供了最基本的api。
想要使用一些奇技淫巧,目前有一些支持库可供参考:
参考
文章写的还不完善,好多地方没有提到,后续继续更新。