转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/122058124
本文出自【赵彦军的博客】

文章目录

  • suspendCancellableCoroutine
  • suspendCancellableCoroutine 和 suspendCoroutine 区别

suspendCancellableCoroutine

普通的回调函数:

interface Result<T> {fun onSuccess(t: T)fun onFailed(e: Exception)
}

回调方法,模拟耗时操作

  fun longTimeMethod(result: Result<String>) {thread {Thread.sleep(5000)if (System.currentTimeMillis() % 10 > 6) {result.onSuccess("${System.currentTimeMillis()}")} else {result.onFailed(Exception("FAILED"))}}}

去掉回调,转换为挂起函数:

 suspend fun getResult(): String =suspendCancellableCoroutine {longTimeMethod(object : Result<String> {override fun onSuccess(t: String) {if (it.isCancelled) returnit.resume(t)}override fun onFailed(e: Exception) {it.resumeWithException(e)}})}

使用:

     GlobalScope.launch {try {val result = getResult()} catch (exception: Exception) {}}

源码分析:

我们看一下 it.resume()it.resumeWithException()方法,其实是调用 resumeWith(result: Result)

suspendCancellableCoroutine 和 suspendCoroutine 区别

  • 使用 suspendCancellableCoroutine 和 suspendCoroutine 都可以将回调函数转换为协程
  • SuspendCancellableCoroutine 返回一个 CancellableContinuation, 它可以用 resume、resumeWithException 来处理回调 和抛出 CancellationException 异常。它与 suspendCoroutine的唯一区别就是 SuspendCancellableCoroutine 可以通过 cancel() 方法手动取消协程的执行,而 suspendCoroutine 没有该方法。
  • 尽可能使用 suspendCancellableCoroutine 而不是 suspendCoroutine ,因为协程的取消是可控的

举个例子:使用网络请求数据时,如果请求时间过长,用户可以手动取消掉协程的执行。这时会抛出一个 CancellationException 异常,但是将该异常try{}catch{}捕获后就不会影响后续代码的执行。而使用 suspendCoroutine 只能干等着被 resume 或者 resumeWithException ,因为它没有该功能。

Android使用suspendCancellableCoroutine将回调转换为协程相关推荐

  1. 关于C10K、异步回调、协程、同步阻塞

    2019独角兽企业重金招聘Python工程师标准>>> 最近到处在争论这些话题,发现很多人对一些基础的常识并不了解,在此发表一文做一下解释.此文未必能解答所有问题,各位能有一个大致的 ...

  2. 并发编程之进程池,线程池 和 异步回调,协程

    1.进程池和线程池 2.异步回调 3.协程 4.基于TCP使用多线程实现高并发 一.进程池和线程池 什么是进程池和线程池: ''' 池 Pool 指的是一个容器 线程池就是用来存储线程对象的 容器创建 ...

  3. 同步与异步,回调与协程

    目录 概念上下文: 同步的方式: 异步加回调的方式: 异步协程方式: 总结: 这里分享一个 协程原理到实现,全局分析丨协程的切换与调度视频点击查看:「链接」 正文 本文主要介绍在网络请求中的同步与异步 ...

  4. android kotlin 回调,[Kotlin协程] 回调地狱的一种解决思路

    背景 异步回调的方式虽然实现了需求,但是牺牲了可读性,过多的回调让代码变得难以维护. 解决思路 rxjava->协程 Java语言开发的时候,可以借助一些第三方库如RxJava,来让减少嵌套. ...

  5. Android秀翻天的操作——使用协程进行网络请求

    文章目录 一.前言 二.Kotlin协程 三.协程和Retrofit 四.预备工作 1.准备好Retrofit 2.准备好协程 五.使用 六.小结 本文已独家授权 郭霖 ( guolin_blog) ...

  6. 0820Python总结-线程队列,进程池和线程池,回调函数,协程

    一.线程队列 from queue import Queue put 存 get 取 put_nowait 存,超出了队列长度,报错 get_nowait 取,没数据时,直接报错 Linux Wind ...

  7. 进程池、线程池、回调函数、协程

    阅读目录 摘要: 进程池与线程池 同步调用和异步调用 回调函数 协程 一.进程池与线程池: 1.池的概念: 不管是线程还是进程,都不能无限制的开下去,总会消耗和占用资源. 也就是说,硬件的承载能力是有 ...

  8. android java协程,Android协程——入门

    一.如何使用协程 1.1 添加依赖 implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.0.0' implementatio ...

  9. 探索 Kotlin 协程原理

    接下来跟大家分享一下我在了解 Kotlin 协程实现的过程中理解的一些概念,如果你发现哪些地方我说错了的话,欢迎提出你的理解. 1. Kotlin 协程原理概述 Kotlin 协程的大致的执行流程如上 ...

最新文章

  1. java swing 文件选择,设置默认文件选择路径,桌面路径
  2. python数据结构学习笔记(五)
  3. SecureCRT的使用
  4. map和struct的多重嵌套
  5. Linux之后台运行(nohup和)
  6. ASP.NET获取任意网页HTML代码
  7. 查询SQL中某表里有多少列包含某字段
  8. Javascript之创建对象(原型模式)
  9. Redis线程IO模型的秘密知多少
  10. 直连路由和静态路由(实验)
  11. MAtlab求函数最大值以及对应自变量
  12. 生信-记一次NCBI-R语言-淋巴癌突变与未突变基因的差异分析
  13. HTML表示RGB颜色的方法
  14. C语言uint8_t和char的区别,c – int8_t和uint8_t是char类型吗?
  15. 服务器怎么和本地共享文件夹同步,云服务器如何共享文件夹同步
  16. AI产业快速落地难?破局人来了
  17. stm32f103c8t6 最小系统板 制作超简单ST-Link下载器
  18. 小米usb测试软件,你还在用USB传文件?小米10系列USB详细测试——《小米10十大槽点》番外 图文版...
  19. 微信小程序内嵌H5页面实现微信支付
  20. 三千预算进卡吧的顺口溜是啥

热门文章

  1. sql两个数字之差取最接近的_从零学DAX/Sql/Python030203SQL数据分类汇总续篇
  2. parted新建分区_扩展分区及文件系统(Linux)
  3. 八、Linux 常用 Shell 命令,控制台的快捷键以及 Shell 编程(中)
  4. DataFountain训练赛 | 用户逾期行为预测
  5. 四十九、深入了解两个并发接口Callable和Runnable的区别
  6. 四、学编程语言前,不了解Git,怎么入坑
  7. keras从入门到放弃(十)手写数字识别训练
  8. 招募 | 贪心科技招募CV、语音分析、联邦学习课程讲师(在线+兼职)
  9. CIKM 2021 | Deep Retrieval:字节跳动深度召回模型论文精读
  10. BERT相关模型汇总梳理