美文网首页Kotlin篇KotlinAndroid控件使用篇
Kotlin-Coroutine协程初探-扫盲

Kotlin-Coroutine协程初探-扫盲

作者: 千夜零一 | 来源:发表于2021-03-31 16:24 被阅读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函数的功能

    • 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

    相关文章

      网友评论

        本文标题:Kotlin-Coroutine协程初探-扫盲

        本文链接:https://www.haomeiwen.com/subject/mjogxltx.html