Android使用suspendCancellableCoroutine将回调转换为协程
转载请标明出处: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将回调转换为协程相关推荐
- 关于C10K、异步回调、协程、同步阻塞
2019独角兽企业重金招聘Python工程师标准>>> 最近到处在争论这些话题,发现很多人对一些基础的常识并不了解,在此发表一文做一下解释.此文未必能解答所有问题,各位能有一个大致的 ...
- 并发编程之进程池,线程池 和 异步回调,协程
1.进程池和线程池 2.异步回调 3.协程 4.基于TCP使用多线程实现高并发 一.进程池和线程池 什么是进程池和线程池: ''' 池 Pool 指的是一个容器 线程池就是用来存储线程对象的 容器创建 ...
- 同步与异步,回调与协程
目录 概念上下文: 同步的方式: 异步加回调的方式: 异步协程方式: 总结: 这里分享一个 协程原理到实现,全局分析丨协程的切换与调度视频点击查看:「链接」 正文 本文主要介绍在网络请求中的同步与异步 ...
- android kotlin 回调,[Kotlin协程] 回调地狱的一种解决思路
背景 异步回调的方式虽然实现了需求,但是牺牲了可读性,过多的回调让代码变得难以维护. 解决思路 rxjava->协程 Java语言开发的时候,可以借助一些第三方库如RxJava,来让减少嵌套. ...
- Android秀翻天的操作——使用协程进行网络请求
文章目录 一.前言 二.Kotlin协程 三.协程和Retrofit 四.预备工作 1.准备好Retrofit 2.准备好协程 五.使用 六.小结 本文已独家授权 郭霖 ( guolin_blog) ...
- 0820Python总结-线程队列,进程池和线程池,回调函数,协程
一.线程队列 from queue import Queue put 存 get 取 put_nowait 存,超出了队列长度,报错 get_nowait 取,没数据时,直接报错 Linux Wind ...
- 进程池、线程池、回调函数、协程
阅读目录 摘要: 进程池与线程池 同步调用和异步调用 回调函数 协程 一.进程池与线程池: 1.池的概念: 不管是线程还是进程,都不能无限制的开下去,总会消耗和占用资源. 也就是说,硬件的承载能力是有 ...
- android java协程,Android协程——入门
一.如何使用协程 1.1 添加依赖 implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.0.0' implementatio ...
- 探索 Kotlin 协程原理
接下来跟大家分享一下我在了解 Kotlin 协程实现的过程中理解的一些概念,如果你发现哪些地方我说错了的话,欢迎提出你的理解. 1. Kotlin 协程原理概述 Kotlin 协程的大致的执行流程如上 ...
最新文章
- java swing 文件选择,设置默认文件选择路径,桌面路径
- python数据结构学习笔记(五)
- SecureCRT的使用
- map和struct的多重嵌套
- Linux之后台运行(nohup和)
- ASP.NET获取任意网页HTML代码
- 查询SQL中某表里有多少列包含某字段
- Javascript之创建对象(原型模式)
- Redis线程IO模型的秘密知多少
- 直连路由和静态路由(实验)
- MAtlab求函数最大值以及对应自变量
- 生信-记一次NCBI-R语言-淋巴癌突变与未突变基因的差异分析
- HTML表示RGB颜色的方法
- C语言uint8_t和char的区别,c – int8_t和uint8_t是char类型吗?
- 服务器怎么和本地共享文件夹同步,云服务器如何共享文件夹同步
- AI产业快速落地难?破局人来了
- stm32f103c8t6 最小系统板 制作超简单ST-Link下载器
- 小米usb测试软件,你还在用USB传文件?小米10系列USB详细测试——《小米10十大槽点》番外 图文版...
- 微信小程序内嵌H5页面实现微信支付
- 三千预算进卡吧的顺口溜是啥
热门文章
- sql两个数字之差取最接近的_从零学DAX/Sql/Python030203SQL数据分类汇总续篇
- parted新建分区_扩展分区及文件系统(Linux)
- 八、Linux 常用 Shell 命令,控制台的快捷键以及 Shell 编程(中)
- DataFountain训练赛 | 用户逾期行为预测
- 四十九、深入了解两个并发接口Callable和Runnable的区别
- 四、学编程语言前,不了解Git,怎么入坑
- keras从入门到放弃(十)手写数字识别训练
- 招募 | 贪心科技招募CV、语音分析、联邦学习课程讲师(在线+兼职)
- CIKM 2021 | Deep Retrieval:字节跳动深度召回模型论文精读
- BERT相关模型汇总梳理