一起来学Kotlin:概念:2. Kotlin Suspend 挂起函数

这里介绍 Kotlin Suspend 挂起函数的使用。挂起(suspend)函数是所有协程的核心。 挂起函数可以执行长时间运行的操作并等待它完成而不会阻塞主线程。Kotlin 的 suspend 关键字可以帮助我们消除回调,用同步的写法写异步。


文章目录

  • 一起来学Kotlin:概念:2. Kotlin Suspend 挂起函数
    • 总结
    • 本质
    • 何时使用
    • 消除回调
    • 一些例子

总结

挂起(suspend)函数是所有协程的核心。 挂起函数可以执行长时间运行的操作并等待它完成而不会阻塞主线程。

挂起函数的语法与常规函数的语法类似,不同之处在于添加了suspend关键字。 它可以接受一个参数并有一个返回类型。 但是,挂起函数只能由另一个挂起函数或在协程内调用。

suspend fun backgroundTask(param: Int): Int {// long running operation
}

在背后,编译器将挂起函数转换为另一个没有挂起关键字的函数,该函数接受一个类型为 Continuation<T> 的附加参数。 例如,上面的函数将由编译器转换为:

fun backgroundTask(param: Int, callback: Continuation<Int>): Int {// long running operation
}

本质

  • 挂起函数只能在协程或者其他挂起函数中调用。
  • 挂起的对象是协程:launch ,async 或者其他函数创建的协程,在执行到某一个 suspend 函数的时候,这个协程会被挂起,即,从正在执行它的线程上脱离。就是说,当前线程跳过这个挂起函数,继续往下运行,但另一方面,线程的代码在到达 suspend 函数的时候被掐断,接下来协程会从这个 suspend 函数开始继续往下执行,不过是在指定的线程,执行完后,返回到之前挂起它的线程;
  • 简单来讲,在 Kotlin 中所谓的挂起,就是一个稍后会被自动切回来的线程调度操作;
  • 挂起函数的特点是使用同步的方式完成异步任务。
  • withContext 的作用就是指定切换的线程,比如:suspend fun suspendingGetImage(id: String) = withContext(Dispatchers.IO)

何时使用

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

耗时操作一般分为两类:I/O 操作和 CPU 计算工作。比如文件的读写、网络交互、图片的模糊处理,都是耗时的,通通可以把它们写进 suspend 函数里。

另外这个「耗时」还有一种特殊情况,就是这件事本身做起来并不慢,但它需要等待,比如 5 秒钟之后再做这个操作。这种也是 suspend 函数的应用场景。

消除回调

假设 postItem 由三个有依赖关系的异步子任务组成: requestTokencreatePostprocessPost,这三个函数都是基于回调的 API:

// 三个基于回调的 API
fun requestToken(block: (String) -> Unit)
fun createPost(token: String,item: Item,block: (Post) -> Unit)
)
fun processPost(post: Post)fun postItem(item: Item) {requestToken { token ->createPost(token, item) { post ->processPost(post)}}
}

可以看到基于回调的 API 很容易造成大量缩进。如果代码中再加上一些条件、循环的逻辑,那么代码可读性会大大降低。Kotlin 的 suspend 关键字可以帮助我们消除回调,用同步的写法写异步

suspend fun requestToken(): String
suspend fun createPost(token: String, item: Item): Post
suspend fun processPost(post)suspend fun postItem(item: Item) {val token = 												

Kotlin 2. Kotlin Suspend 挂起函数相关推荐

  1. Kotlin的协程:挂起函数

    挂起函数 挂起函数是指使用 suspend 关键字修饰的函数. suspend fun getUserInfo(): String {withContext(Dispatchers.IO) {dela ...

  2. Kotlin学习笔记23 协程part3 lambda表达式深入 挂起函数 全局协程

    参考链接 示例来自bilibili Kotlin语言深入解析 张龙老师的视频 1 lambda表达式深入 /*** lambda 表达式深入* 当函数参数是函数时 并且该函数只有一个参数 可以不传入任 ...

  3. kotlin挂起函数

    Kotlin组合挂起函数分为默认顺序调用.使用 async 并发.惰性启动的 async.async 风格的函数.使用 async 的结构化并发.取消始终通过协程的层次结构来进行传递: package ...

  4. 深入理解Kotlin协程suspend工作原理(初学者也能看得懂)

    1. 概述 挂起函数是Kotlin协程最重要的一个特性,所有其他概念都建立在它的基础上.所以我们需要深入了解它的工作原理. 挂起协程意味着在中间停止它.这类似于玩游戏,当我们想暂停游戏时,可以先存档, ...

  5. 挂起函数suspend

    前言:kotlin挂起函数+ViewModel,使异步如此简单. 案例:(1)下载文件(2)保存文件 viewModelScope.launch {kotlin.runCatching {//下载文件 ...

  6. Kotlin协程:挂起与恢复原理逆向刨析

    前言:只有在那崎岖的小路上不畏艰险奋勇攀登的人,才有希望达到光辉的顶点. --马克思 前言 经过前面两篇协程的学习,我相信大家对协程的使用已经非常熟悉了.本着知其然更要知其之所以然的心态,很想知道它里 ...

  7. [译]Effective Kotlin系列之探索高阶函数中inline修饰符(三)

    简述: 不知道是否有小伙伴还记得我们之前的Effective Kotlin翻译系列,之前一直忙于赶时髦研究Kotlin 1.3中的新特性.把此系列耽搁了,赶完时髦了还是得踏实探究本质和基础,从今天开始 ...

  8. Kotlin实践(3)-入口 函数

    main函数是kotlin程序的入口,print函数可向标准输出打印文本,但不打印行结束符,而println函数可以向标准输出打印文本,并换行. fun main() {println("我 ...

  9. Kotlin学习笔记 第三章 函数 高阶函数 lambda表达式 内联函数

    参考链接 Kotlin官方文档 https://kotlinlang.org/docs/home.html 中文网站 https://www.kotlincn.net/docs/reference/p ...

最新文章

  1. VS2010 ,工程文件减肥
  2. java%3e%3e=符号_android中一些特殊字符(如:←↑→↓等箭头符号)的Unicode码值...
  3. 我为何爱读代码?你为何也应当爱?
  4. 【右滑返回】滑动冲突 Scroller DecorView
  5. kafka可视化客户端工具(Kafka Tool)的使用
  6. 设计模式视频教程——【从设计到模式】
  7. java里包含怎么算_java中怎么判断一个字符串中包含某个字符或字符串
  8. 图像融合(五)-- 梯度金字塔
  9. Docker日志自动化: ElasticSearch、Logstash、Kibana以及Logspout
  10. 微宝球型机器人功能_《宇宙机器人 无线控制器使用指南》评测:与次世代的美好初恋...
  11. SOUI消息订阅事件实例
  12. 可以插卡的ipad_平板电脑可以插手机卡吗,终于能插卡了!苹果iPad 2018蜂窝网络版上架国内官网...
  13. @ResponseStatus的作用
  14. 什么是EDM营销?EDM营销和一般营销方式的区别分析
  15. ukf实测信号的预测 matlab,ukf的matlab实现
  16. 北航c语言程序设计大一期末题库,北航2016C语言|程序设计题七
  17. RadioButtonList 横着排列
  18. Fine-Grained Representation Learning and Recognition by Exploiting Hierarchical Semantic Embedding
  19. 自动语音播报WinCC报警消息
  20. [CISCN2019 华北赛区 Day1 Web2]ikun

热门文章

  1. 什么是java虚拟机所支持的指令,含小米、腾讯、阿里
  2. ABAP项目砖家之旅-ABAP对象命名规则
  3. 基于java互助平台设计_学生学习交流互助社区系统的设计与实现(MySQL)
  4. 分享三款能够将图片转化为文字的软件
  5. 新手入门,网络营销需要做什么?
  6. moco的使用,moco测试前端页面、moco的启动、moco前端测试工具、moco的例子
  7. 热力学第一定律和热容(大学物理笔记)
  8. 【目标检测】|MobileNet
  9. Python 读写文件时报错 ValueError: must have exactly one of create/read/write/append mode
  10. How to create WSDL SourceCode from a webservice.