前言: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相关推荐

  1. Kotlin 2. Kotlin Suspend 挂起函数

    一起来学Kotlin:概念:2. Kotlin Suspend 挂起函数 这里介绍 Kotlin Suspend 挂起函数的使用.挂起(suspend)函数是所有协程的核心. 挂起函数可以执行长时间运 ...

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

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

  3. Kotlin的协程:挂起函数

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

  4. kotlin挂起函数

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

  5. linux hibernate suspend 区别,实现Linux休眠(sleep/hibernate)和挂起(suspend)

    实现Linux休眠(sleep/hibernate)和挂起(suspend) 发布时间:2007-03-15 01:07:00来源:红联作者:XLooking 系统要求: 1.配置并编译内核:kern ...

  6. linux hibernate suspend 区别,实现Linux休眠(sleep/hibernate)和挂起(suspend)[转]

    系统要求: 1.配置并编译内核:kernel2.6 2.软件:hibernate 测试环境: 1.系统Debian testing etch 2.桌面:fluxbox 3.Thinkpad r40 细 ...

  7. Linux下怎么让挂起的(suspend or stopped)进程恢复执行(resume)

    今天在linux安装app的时候,安装的进度长时间停止不前.于是我使用Ctrl + Z 打断了安装.然后又运行了一遍安装的命令.这个时候,提示了警告,说这个安装已经安排了但是现在的状态是suspend ...

  8. linux关机 hibernate,实现Linux休眠(sleep/hibernate)和挂起(suspend)

    系统要求: 1.配置并编译内核:kernel2.6 2.软件:hibernate 测试环境: 1.系统Debian testing etch 2.桌面:fluxbox 3.Thinkpad r40 细 ...

  9. python 挂起_Python Killing挂起函数

    我正在为一个概念性问题编写一个服务器后端,这个问题可能是在一些CTF挑战中托管的. 它将托管在Ubuntu12.04LTS.nginx1.1.19和uWSGI 1.0.3-debian上,后者将处理p ...

最新文章

  1. maven nexus 3 third party 构件上传
  2. 用c语言找出第123个素数,在C语言中查找第N个素数
  3. 用策略屏蔽135 139 445 3389端口+网络端口安全防护技
  4. 分布式数据库切分规则介绍
  5. python自动化工具_Python啥都行_Robot自动化测试
  6. Bit-Z推出去中心化多链钱包CoinU 打造资产价值生态体系
  7. HSRP双机热备工作原理与配置
  8. 施密特触发器(Schmitt Trigger)?
  9. 单片机c语言怎样添加自定义头文件,单片机C语言编程与或|头文件常见问题
  10. JSON Web Token(缩写 JWT) 目前最流行的跨域认证解决方案
  11. 开发者点评 GitHub 暗黑模式:太暗了
  12. 第一部分 第五章 数组 1102-1149
  13. 求100以内的素数,全部打印出来
  14. 笔记本安装PCMCIA并口卡
  15. html复制粘贴的文字自动换行,word中复制的文字出现自动换行怎么办
  16. 50 条有趣的 Python 一行代码,建议收藏夹吃灰
  17. 算法学习笔记:涉及动态规划的简单例题
  18. 图像处理​​​​​​​--十大经典算法
  19. SNS运营之Tumblr迅速涨粉的20个方法-适用于海外社媒推广,外贸独立站,自建站,让你粉丝快速翻倍
  20. JGG | 河北大学杜会龙组综述植物泛基因组学研究

热门文章

  1. sofa框架server-client搭建
  2. 【手机电子杂志制作】云展网教程 | 如何隐藏/显示使用说明(移动端)
  3. python 连接数据库 慢_python数据库mysql第二天
  4. 微软 Win10 Dev 预览版 21354 发布
  5. 姐弟恋也很可爱:姐弟恋有什么好处和注意事项?
  6. android 4个点矫正不规则矩形_一个LOGO由3000个点组成,75种变化,你这个LOGO想干嘛?...
  7. eclipse 项目报错 但没有提示哪里出错
  8. uniapp 移动端 两种横竖屏切换方案
  9. 3DMAX怎样运用布尔运算
  10. postfix 实现自动发邮件