添加依赖:

dependencies {

implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.0")

implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.0")

}

使用示例:

//方法一,使用 runBlocking 顶层函数
runBlocking {getUser(userId)
}
​
//方法二,使用 GlobalScope 单例对象
GlobalScope.launch {getUser(userId)
}
​
//方法三,自行通过 CoroutineContext 创建一个 CoroutineScope 对象
val coroutineScope = CoroutineScope(context)
coroutineScope.launch {getUser(userId)
}CoroutineScope(Dispatchers.IO).launch {getUser(userId)
}

launch并不是一个顶层函数,不能直接用,它必须在一个对象中使用,launch 函数加上实现在 {} 中具体的逻辑,就构成了一个协程。

CoroutineScope(Dispatchers.IO).launch{val image = getImage(imageId)launch(Dispatch.Main) {avatarIv.setImageBitmap(image)}
}suspend fun getImage(imageId: String):Bitmap{//...
}

withContext:

这个函数可以切换到指定的线程,并在闭包内的逻辑执行结束之后,自动把线程切回去继续执行。

CoroutineScope(Dispatchers.Main).launch {//在UI线程开始val image = withContext(Dispatchers.IO) {//切换到IO线程,并在执行完成后切回UI线程getImage(imageId)//运行在IO线程}avatarIv.setImageBitmap(image)//回到UI线程更新UI
}

suspend (挂起):

协程在执行到有 suspend 标记的函数的时候,会被suspend,也就是被挂起,而所谓的被挂起,本质就是切换线程;

不过区别在于,挂起函数在执行完成之后,协程会重新切回它原先的线程。

再简单来讲,在 Kotlin 中所谓的挂起,就是一个稍后会被自动切回来的线程调度操作。

这个「切回来」的动作,在 Kotlin 里叫做 resume,恢复。

挂起之后是需要恢复的,而恢复这个功能是协程的,如果你不在协程里面调用,恢复这个功能没法实现,所以挂起函数必须在协程或者另一个挂起函数里被调用。

什么时候需要自定义suspend函数?

原则:如果某个函数比较耗时,也就是要做等的操作,那就把它写成 suspend 函数。

耗时操作一般分为两类:I/O 操作和 CPU 计算工作。比如文件的读写、网络交互、图片的模糊处理等。另外就是逻辑中有等待操作,比如delay(5) ,这种也是 suspend 函数的应用场景。

总结:

1.协程就是切线程;

2.挂起就是可以自动切回来的切线程;

3.挂起的非阻塞式指的是它能用看起来阻塞的代码写出非阻塞的操作。

协程Coroutines入门相关推荐

  1. kotlin coroutines 协程教程-入门用法

    kotlin coroutines 协程教程-入门用法 Coroutine 协程,是kotlin 上的一个轻量级的线程库,对比 java 的 Executor,主要有以下特点: 更轻量级的 api 实 ...

  2. python3可迭代对象、迭代器、生成器、协程yield入门

    #!/usr/bin/env python # -*- coding: utf-8 -*- # @Date : 2019-01-24 16:13:07 # @Author : cdl (1217096 ...

  3. Unity3D之协程(Coroutines Yield )

    写游戏代码,往往最终需要代码为连续的事件.结果会像这样: [它可以实现将一段程序延迟执行或者将其各个部分分布在一个时间段内连续执行.] private int state = 0; void Upda ...

  4. Android中使用Kotlin协程(Coroutines)和Retrofit进行网络请求(二)之文件下载

    写在前面 下载功能是非常常用的功能,今天我们要通过kotlin协程和retrofit来是实现文件下载的功能.retorfit本身可以将请求结果以InputStream的形式返回,拿到InputStre ...

  5. Generator(生成器),入门初基,Coroutine(原生协程),登峰造极,Python3.10并发异步编程async底层实现

    普遍意义上讲,生成器是一种特殊的迭代器,它可以在执行过程中暂停并在恢复执行时保留它的状态.而协程,则可以让一个函数在执行过程中暂停并在恢复执行时保留它的状态,在Python3.10中,原生协程的实现手 ...

  6. Python 异步 IO 、协程、asyncio、async/await、aiohttp

    From :廖雪峰 异步IO :https://www.liaoxuefeng.com/wiki/1016959663602400/1017959540289152 Python Async/Awai ...

  7. python正在处理中_协程和 asyncio

    在本系列的 第 1 部分 中,您了解了 Python 迭代器:在 第 2 部分 中,您了解了 itertools.在这一部分,将了解一种称为协程(Coroutines)的特殊的生成器函数.您还将了解另 ...

  8. 一文彻底搞懂协程(coroutine)是什么,值得收藏

    什么是协程 我们可以简单的认为:协程就是用户态的线程,但是上下文切换的时机是靠调用方(写代码的开发人员)自身去控制的. 同时,协程和用户态线程非常接近,用户态线程之间的切换不需要陷入内核,但部分操作系 ...

  9. python 协程_Python 协程与 Go 协程的区别(一)

    ? "Python猫" ,一个值得加星标的公众号 花下猫语:年关将近,不知各位过得怎样?我最近有些忙,收获也挺多,以后有机会分享下.吃饭时间,追了两部剧<了不起的麦瑟尔夫人& ...

最新文章

  1. JAVA之JVM垃圾回收(GC)机制详解
  2. ones--创建全1矩阵
  3. java ios websocket_Java WebSocket的例子
  4. android android studio单元测试实例
  5. 文件句柄(file handles) 文件描述符(file descriptors)
  6. 更改MFC生成的程序的默认exe图标
  7. 阿里云上Kubernetes集群联邦
  8. BZOJ 3747 POI2015 Kinoman 段树
  9. Wi-Fi 6 爆发的 2019
  10. Netty websocket 推送数据压缩以 js解压
  11. AngularJs的UI组件ui-Bootstrap分享(四)——Datepicker Popup
  12. VS.NET(C#)-5.18_IIS6架构模型:工作进程(Worker Process)简介
  13. OSChina 周三乱弹 ——垂死病中惊坐起,夜深还过女嫱来
  14. PS怎么做出旧电视图像故障视觉特效
  15. 记录一下如何运行MDX文件
  16. 2021湖南耒阳二中高考成绩查询,来自耒阳各校的高考喜报
  17. 【技术方案】如何基于高清摄像头设备,搭建慢直播平台?
  18. python 安装PIL模块,并且查看图片大小
  19. 小程序商城制作一个需要多少钱?一般包括哪些费用?
  20. 2020 必须收藏的vscode主题【清爽的前端配置 vue】

热门文章

  1. 【SpringMVC】概述
  2. ubuntu搭建nginx环境
  3. 通俗理解tf.name_scope()、tf.variable_scope()
  4. python究竟要不要使用多线程
  5. pytorch记录:seq2seq例子看看这torch怎么玩的
  6. 2021年腾讯云安装Docker最简洁方法
  7. 2021年大数据Hadoop(十二):HDFS的API操作
  8. Docker核心技术之数据管理
  9. ProgreassBar 60秒走完,
  10. android studio 导入库提示失败的处理方法以及androidstudio 清理缓存的方法