什么是协程?
- 轻量级线程,
- 用户态的,
- 很像线程但又不是线程。
什么是kotlin中的协程?
协程是Kotlin官方提供的线程API,更准确的说是一个线程框架
类似于Java中的Executors 以及Android中的Handler和AsyncTask 以及NetFlex的RxJava。
简而言之,协程即时切线程。
为什么kotlin中要提供协程呢?
好处:方便,借助于Kotlin的语言优势,它比Java中基于线程的方案会更方便更好用!
【最最最重要的是】:能用看起来同步的方式写出异步的代码。
...
val product = apiService.getProduct() //发起网络请求(子线程中)
priceTv.text = product.price //更新UI(UI线程中)
....
launch的参数、含义
协程最基本的功能就是并发也就是多线程,我们可以把任务切到到后台执行也可以是前台
在Kotlin的协程中我们可以把多个不同的任务执行写到一个代码块里。
launch函数就是用来创建协程的,而后面的参数就是指定了创建的协程运行在哪个线程中
launch(Dispatchers.main){ // UI线程
// 发起网络请求(子线程中)任务执行切到子线程中,当任务结束之后在切换到UI线程中
// 这个Java应该是做不到的
val product = apiService.getProduct()
priceTv.text = product.price //更新UI(UI线程中)
}
协程到底是个啥?
创建的代码块中执行的代码就是所谓的协程。
val product = apiService.getProduct()
priceTv.text = product.price //更新UI(UI线程中)
withContext函数的功能
- 1、创建了一个协程,指明这个协程运行在什么线程中;
- 2、当这个协程执行完毕之后 会重新切换到UI线程中,来继续执行。
launch(Dispatchers.main){
val data = withContext(Dispatchers.IO){
apiService.getData()
}
priceTv.text = data.price
}
Kotlin协程中的核心关键字-suspend(挂起)
将withContext放入到一个功能函数中,需要使用suspend关键字
GlobalScope.launch(Dispatchers.Main){
val data = getData()
priceTv.text = data.price
}
suspend fun getData():Data{
return withContext(Dispatchers.IO){
ApiService.getData()
}
}
因为 withContext函数也是suspend关键字修饰,而suspend修饰符修饰的函数必须在协程中调用或者另外一个suspend修饰的函数中调用【源码:】
public suspend fun <T> withContext(
context: CoroutineContext,
block: suspend CoroutineScope.() -> T
): T = suspendCoroutineUninterceptedOrReturn sc@ {}
什么是挂起?
挂起就是既能切线程又能自动切回来的
开启协程的方式?(两种)
1、runBlocking
2、launch
runBolcking是什么?
runBlocking启动的协程任务会阻断当前线程,直到该协程执行结束。
runBlocking中调用launch()会在当前线程中执行协程,
也就是说在runBlocking中不管开启多少个子协程它们都是使用runBlocking所使用的那一条线程来完成任务的,
所以就会出现多个子协程霸占线程的情况。
launch是什么?
【GlobalScope.launch{}详解】:
可以切换协程到子线程中执行,然后在切回主线程更新UI
不会出现线程被霸占的情况。
协程的非阻塞式是什么?
以阻塞式的方式写出了非阻塞式的代码。
github链接:https://github.com/Kingcool759/KCcoroutine/tree/master
网友评论