挂起函数suspend
前言:kotlin挂起函数+ViewModel,使异步如此简单。
案例:(1)下载文件(2)保存文件
viewModelScope.launch {kotlin.runCatching {//下载文件HomeRespository().downFile(billLogoUrl)}.onSuccess {kotlin.runCatching {//保存文件val fileName = billLogoUrl.substring(billLogoUrl.lastIndexOf("/"))FileUtil.saveFile(it.byteStream(), FileUtil.PATH, fileName)}.onSuccess {AppPrefsUtils.putBoolean(AppPrefsUtils.BILL_LOGO_DOWN_SUCCESS, true)}.onFailure {AppPrefsUtils.putBoolean(AppPrefsUtils.BILL_LOGO_DOWN_SUCCESS, false)}}.onFailure {AppPrefsUtils.putBoolean(AppPrefsUtils.BILL_LOGO_DOWN_SUCCESS, false)}
}
class HomeRespository {private val mService = RetrofitFactory.instance.create(BaseConstant.SERVICE_HOST).create(HomeApi::class.java)suspend fun downFile(url: String): ResponseBody {return mService.downFile(url)}
}
interface HomeApi {@Streaming@GETsuspend fun downFile(@Url url: String): ResponseBody
}
object FileUtil {val PATH = "Demo/take"suspend fun saveFile(inputStream: InputStream, path: String, fileName: String) = withContext(Dispatchers.IO){val buff = ByteArray(4096)val folder = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {BaseApplication.context.filesDir} else {Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)}val dir = File(folder, path)if (!dir.exists()){dir.mkdirs()}val file = File(dir, fileName)if (file.exists()) {file.delete()}file.createNewFile()val output = FileOutputStream(file)var readed = inputStream.read(buff)while (readed != -1) {output.write(buff, 0, readed)readed = inputStream.read(buff)}output.flush()output.close()inputStream.close()}
}
注:
(1)下载文件:由Retrofit支持挂起函数,只需将fun前加上suspend即可
(2)保存文件:通过withContext(Dispatchers.IO)和suspend来实现异步耗时任务
(3)viewModelScope默认是主线程,只是挂起fun在子线程执行,onSuccess和onFailure均在viewModelScope线程即主线程
(4)suspend声明fun为挂起函数,该函数可以调用挂起函数或者通过withContext(Dispatchers.IO)实现具体操作,如果仅仅是普通的fun前加suspend是无效的仍为普通fun
挂起函数suspend相关推荐
- Kotlin 2. Kotlin Suspend 挂起函数
一起来学Kotlin:概念:2. Kotlin Suspend 挂起函数 这里介绍 Kotlin Suspend 挂起函数的使用.挂起(suspend)函数是所有协程的核心. 挂起函数可以执行长时间运 ...
- Kotlin学习笔记23 协程part3 lambda表达式深入 挂起函数 全局协程
参考链接 示例来自bilibili Kotlin语言深入解析 张龙老师的视频 1 lambda表达式深入 /*** lambda 表达式深入* 当函数参数是函数时 并且该函数只有一个参数 可以不传入任 ...
- Kotlin的协程:挂起函数
挂起函数 挂起函数是指使用 suspend 关键字修饰的函数. suspend fun getUserInfo(): String {withContext(Dispatchers.IO) {dela ...
- kotlin挂起函数
Kotlin组合挂起函数分为默认顺序调用.使用 async 并发.惰性启动的 async.async 风格的函数.使用 async 的结构化并发.取消始终通过协程的层次结构来进行传递: package ...
- linux hibernate suspend 区别,实现Linux休眠(sleep/hibernate)和挂起(suspend)
实现Linux休眠(sleep/hibernate)和挂起(suspend) 发布时间:2007-03-15 01:07:00来源:红联作者:XLooking 系统要求: 1.配置并编译内核:kern ...
- linux hibernate suspend 区别,实现Linux休眠(sleep/hibernate)和挂起(suspend)[转]
系统要求: 1.配置并编译内核:kernel2.6 2.软件:hibernate 测试环境: 1.系统Debian testing etch 2.桌面:fluxbox 3.Thinkpad r40 细 ...
- Linux下怎么让挂起的(suspend or stopped)进程恢复执行(resume)
今天在linux安装app的时候,安装的进度长时间停止不前.于是我使用Ctrl + Z 打断了安装.然后又运行了一遍安装的命令.这个时候,提示了警告,说这个安装已经安排了但是现在的状态是suspend ...
- linux关机 hibernate,实现Linux休眠(sleep/hibernate)和挂起(suspend)
系统要求: 1.配置并编译内核:kernel2.6 2.软件:hibernate 测试环境: 1.系统Debian testing etch 2.桌面:fluxbox 3.Thinkpad r40 细 ...
- python 挂起_Python Killing挂起函数
我正在为一个概念性问题编写一个服务器后端,这个问题可能是在一些CTF挑战中托管的. 它将托管在Ubuntu12.04LTS.nginx1.1.19和uWSGI 1.0.3-debian上,后者将处理p ...
最新文章
- maven nexus 3 third party 构件上传
- 用c语言找出第123个素数,在C语言中查找第N个素数
- 用策略屏蔽135 139 445 3389端口+网络端口安全防护技
- 分布式数据库切分规则介绍
- python自动化工具_Python啥都行_Robot自动化测试
- Bit-Z推出去中心化多链钱包CoinU 打造资产价值生态体系
- HSRP双机热备工作原理与配置
- 施密特触发器(Schmitt Trigger)?
- 单片机c语言怎样添加自定义头文件,单片机C语言编程与或|头文件常见问题
- JSON Web Token(缩写 JWT) 目前最流行的跨域认证解决方案
- 开发者点评 GitHub 暗黑模式:太暗了
- 第一部分 第五章 数组 1102-1149
- 求100以内的素数,全部打印出来
- 笔记本安装PCMCIA并口卡
- html复制粘贴的文字自动换行,word中复制的文字出现自动换行怎么办
- 50 条有趣的 Python 一行代码,建议收藏夹吃灰
- 算法学习笔记:涉及动态规划的简单例题
- 图像处理​​​​​​​--十大经典算法
- SNS运营之Tumblr迅速涨粉的20个方法-适用于海外社媒推广,外贸独立站,自建站,让你粉丝快速翻倍
- JGG | 河北大学杜会龙组综述植物泛基因组学研究
热门文章
- sofa框架server-client搭建
- 【手机电子杂志制作】云展网教程 | 如何隐藏/显示使用说明(移动端)
- python 连接数据库 慢_python数据库mysql第二天
- 微软 Win10 Dev 预览版 21354 发布
- 姐弟恋也很可爱:姐弟恋有什么好处和注意事项?
- android 4个点矫正不规则矩形_一个LOGO由3000个点组成,75种变化,你这个LOGO想干嘛?...
- eclipse 项目报错 但没有提示哪里出错
- uniapp 移动端 两种横竖屏切换方案
- 3DMAX怎样运用布尔运算
- postfix 实现自动发邮件