当前位置: 首页 > news >正文

kotlin中withContext,async,launch几种异步的区别

在 Kotlin 协程中,withContextasynclaunch 是常用的异步/并发操作函数,它们的主要区别在于用途和返回值:


1. launch

  • 作用:启动一个新的协程,用于执行不返回结果的并发任务。
  • 使用场景:适合执行没有返回值的副作用操作(如更新 UI、网络请求后保存数据等)。
  • 特点
    • 不会阻塞当前线程。
    • 可以指定调度器(如 Dispatchers.IO, Dispatchers.Main)。
    • 通常用于启动“火与忘”(fire and forget) 类型的任务。
lifecycleScope.launch(Dispatchers.IO) {// 执行后台任务
}

2. async

  • 作用:启动一个协程,并返回一个 Deferred<T> 对象,可以通过 .await() 获取结果。
  • 使用场景:适用于需要并发执行多个任务并等待它们的结果时。
  • 特点
    • 支持并发执行多个 async 任务。
    • 需要调用 .await() 来获取结果。
    • 如果其中一个 async 抛出异常,只有在调用 .await() 时才会抛出。
val result = lifecycleScope.async(Dispatchers.IO) {// 执行后台任务并返回结果"Result"
}val data = result.await() // 等待结果

3. withContext

  • 作用:切换协程的上下文(如调度器),并在指定上下文中执行代码块,返回代码块的执行结果
  • 使用场景:替代嵌套的 async { ... }.await(),简化单个并发任务的写法。
  • 特点
    • 更简洁,推荐用于单一任务切换线程。
    • 没有 async 的并发能力,但语义更清晰。
    • 更适合替换旧的 runBlockingRxJava.subscribeOn(Schedulers.io())
val result = withContext(Dispatchers.IO) {// 执行后台任务并返回结果"Result"
}

三者对比总结:

函数是否返回结果是否支持并发推荐用途
launch启动无返回值的并发任务
async并发执行多个任务并获取结果
withContext切换线程并返回结果(适合单一任务)

实际建议:

  • 如果你只需要切换线程执行单一任务并返回结果,优先使用 withContext
  • 如果你需要并发执行多个任务并等待所有结果,使用多个 async + await
  • 如果你只是想启动一个后台任务不关心结果,使用 launch

在你的代码中的应用优化:

你当前使用了 async + await 嵌套来发起网络请求:

val response = async(Dispatchers.IO) {MyApi.getApi().getData()
}.await()

可以简化为:

val response = withContext(Dispatchers.IO) {MyApi.getApi().getData()
}

这样结构更清晰,避免不必要的嵌套。

http://www.lryc.cn/news/584598.html

相关文章:

  • 目标检测中的评价指标计算
  • Spring Boot项目中大文件上传的高级实践与性能优化
  • 三维旋转沿轴分解
  • Java设计模式之行为型模式(观察者模式)介绍与说明
  • 约束-1-约束
  • selenium中xpath的用法大全
  • Web学习笔记2
  • [架构之美]虚拟机Ubuntu密码重置
  • nmap扫描指定网段中指定开放端口的主机(IP,mac地址)
  • Kafka的无消息丢失配置怎么实现
  • 删除k8s安装残留
  • 「Java案例」求PI的值
  • 告别卡顿与慢响应!现代 Web 应用性能优化:从前端渲染到后端算法的全面提速指南
  • 快速搭建服务器,fetch请求从服务器获取数据
  • 搭建自动化工作流:探寻解放双手的有效方案(1)
  • RK3568项目(八)--linux驱动开发之基础外设(上)
  • Linux驱动开发(platform 设备驱动)
  • ARM单片机滴答定时器理解与应用(二)(详细解析)(完)
  • 多线程交替打印
  • 技术学习_检索增强生成(RAG)
  • 【个人笔记】负载均衡
  • 微服务项目远程调用时的负载均衡是如何实现的?
  • Prompt提示词的主要类型和核心原则
  • 【WEB】Polar靶场 Day8 详细笔记
  • Docker 镜像加速站汇总与使用指南
  • SpringBoot系列—MyBatis(xml使用)
  • Flink自定义函数
  • 一个编辑功能所引发的一场知识探索学习之旅(JavaScript、HTML)
  • Android 插件化实现原理详解
  • 虚拟储能与分布式光伏协同优化:新型电力系统的灵活性解决方案