美文网首页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协程初探-扫盲

    什么是协程? 轻量级线程, 用户态的, 很像线程但又不是线程。 什么是kotlin中的协程? 协程是Kotlin官...

  • 协程初探

    在使用swoole携程时候,怎样实现等待效果咧,下面我们学习一下

  • 初探python协程

    第一次研究协程,仅做学习记录,如果有不对的地方,还望各位不吝赐教,多谢。 什么是协程(Coroutine)? 协程...

  • 协程 Kotlin Coroutine 初探

    协程 kotlin Coroutine 目录: 1. Coroutine 的基本使用 1.1 小结 2. Cor...

  • Android Kotlin协程初探

    协程概述: 为什么需要协程,协程是什么?为什么需要协程:从操作系统发展历史角度入手:真空管+穿孔卡片工作机制:程序...

  • 初探go的协程池

    为什么需要协程池 虽然go语言在调度Goroutine已经优化的非常完善,开启一个Goroutine的代价非常小。...

  • python异步协程(aiohttp,asyncio)

    python异步协程 环境:python3.7.0 协程 协程,英文叫做 Coroutine,又称微线程,纤程,协...

  • 协程(三)IEnumerable、IEnumerator、for

    协程(一)基本使用协程(二)协程什么时候调用协程(三)IEnumerable、IEnumerator、foreac...

  • 协程(五)简单模拟协程

    协程(一)基本使用协程(二)协程什么时候调用协程(三)IEnumerable、IEnumerator、foreac...

  • 协程(一)基本使用

    协程(一)基本使用协程(二)协程什么时候调用协程(三)IEnumerable、IEnumerator、foreac...

网友评论

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

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