Kotlin篇KotlinAndroid控件使用篇

Kotlin-Coroutine协程初探-扫盲

2021-03-31  本文已影响0人  千夜零一

什么是协程?

什么是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函数的功能

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

上一篇下一篇

猜你喜欢

热点阅读