1、什么是协程
- 一套由Kotlin官方提供的线程框架API,支持线程切换,可以用看起来同步的方式写出异步代码,从而实现其非阻塞式挂起。
2、什么是挂起
3、什么是非阻塞式
- 指协程可以用看起来阻塞式的代码写出非阻塞式的操作。
4、 Kotlin协程相当于轻量级线程?
- 这是Kotlin官方描述的,其实是错误的描述,只是为了推广Kotlin协程搞的一个幌子而已,Kotlin的协程要对比也是跟Java的线程池去进行对比才有意义,具体代码分析如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vdMpoN8e-1646326116949)(http://note.youdao.com/yws/res/14801/B2BFFA81F5DB4A5996F7F28D6779C63A)]
5、Kotlin的协程在Android中如何使用
(1)创建协程
方法 | 作用 |
---|
GlobalScope.launch | 创建一个不会阻塞当前线程、没有返回结果的Coroutine,但会返回一个Job对象,可以用于控制这个Coroutine的执行和取消。 |
runBlocking | 创建一个会阻塞当前线程的Coroutine。 |
class TestActivity : AppCompatActivity() {
var job: Job? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.fragment_home)
launch()
}
// launch方式创建协程
private fun launch() {
job = GlobalScope.launch(Dispatchers.IO) {
var content = getNetworkJson()
Log.d("Coroutine", content)
withContext(Dispatchers.Main) {
// 拿到数据后切换回UI线程刷新页面
}
}
}
// runBlocking方式创建协程,注意这里会阻塞UI线程
private fun runBlocking() {
runBlocking(Dispatchers.IO) {
var content = getNetworkJson()
Log.d("Coroutine", content)
withContext(Dispatchers.Main) {
// 拿到数据后切换回UI线程刷新页面
}
}
}
// 模拟网络请求
private suspend fun getNetworkJson(): String {
return "{\"data\": \"这是网络请求数据\",\"errorCode\": 200,\"errorMsg\": \"请求成功\"}"
}
// 让协程运行完
private suspend fun join() = job?.join()
// 取消协程
private fun cancel() = job?.cancel()
override fun onDestroy() {
super.onDestroy()
// 取消掉所有协程内容
cancel()
}
}
(2)dispatchers:协程调度器
方法 | 作用 |
---|
Dispatchers.Default | 在线程池中执行。适合CPU密集型的任务,比如解析JSON文件,排序一个较大的list。 |
Dispatchers.Main | Android中的主线程,可以直接操作UI。 |
Dispatchers.IO | 在线程池中执行。针对磁盘和网络IO进行了优化,适合IO密集型的任务,比如:读写文件,操作数据库以及网络请求。 |
Dispatchers.Unconfined | 在调用的线程直接执行。 |
newSingleThreadContext(name: String) | 使用新的线程。 |
(3)withContext:切换线程