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

Android 协程实用模板

整理了一个 Android 协程实用模板,涵盖 Activity/Fragment/VM 生命周期绑定、并发网络请求、异常处理、超时、Flow使用。


Android 协程全套模板(Kotlin)

// ================================
// 网络模拟函数
// ================================
suspend fun fetchData1(): String {delay(1000) // 模拟网络return "Data1"
}suspend fun fetchData2(): String {delay(1500)return "Data2"
}// ================================
// ViewModel 示例
// ================================
class MyViewModel : ViewModel() {// 1. 生命周期感知的协程作用域private val _data = MutableLiveData<String>()val data: LiveData<String> = _dataprivate val handler = CoroutineExceptionHandler { _, e ->Log.e("Coroutine", "VM caught $e")}fun loadData() {viewModelScope.launch(handler) {try {// 并行请求val deferred1 = async { fetchData1() }val deferred2 = async { fetchData2() }val result1 = deferred1.await()val result2 = deferred2.await()_data.value = "$result1 + $result2"} catch (e: Exception) {Log.e("Coroutine", "Error loading data: $e")}}}fun loadDataWithTimeout() {viewModelScope.launch {try {val result = withTimeout(2000L) { fetchData1() }_data.value = result} catch (e: TimeoutCancellationException) {Log.e("Coroutine", "Request timed out")}}}// Flow 示例fun loadFlowData(): Flow<Int> = flow {for (i in 1..5) {delay(200)emit(i)}}
}// ================================
// Activity 示例
// ================================
class MainActivity : AppCompatActivity() {private val viewModel: MyViewModel by viewModels()override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)// 订阅 LiveDataviewModel.data.observe(this) { value ->Log.d("MainActivity", "Data updated: $value")}// 加载数据viewModel.loadData()// Flow 收集示例lifecycleScope.launch {viewModel.loadFlowData().map { it * 2 }.filter { it > 5 }.collect { Log.d("Flow", it.toString()) }}}
}// ================================
// 手动 CoroutineScope 示例
// ================================
class Repository {private val scope = CoroutineScope(Dispatchers.IO + SupervisorJob())fun fetchMultiple() {scope.launch {try {val results = awaitAll(async { fetchData1() },async { fetchData2() })Log.d("Repository", "Results: $results")} catch (e: Exception) {Log.e("Repository", "Error: $e")}}}fun cancelAll() {scope.cancel() // 取消所有挂起的任务}
}

模板亮点

  1. 生命周期绑定

    • viewModelScope → ViewModel 生命周期

    • lifecycleScope → Activity/Fragment 生命周期

  2. 并发与串行

    • async + await 并行执行任务

    • awaitAll 批量并发等待

  3. 异常处理

    • try-catch 捕获异常

    • CoroutineExceptionHandler 处理协程未捕获异常

    • SupervisorJob 隔离子协程异常

  4. 超时与取消

    • withTimeout 控制超时

    • scope.cancel() 手动取消

  5. 响应式流

    • Flow + map/filter/collect


这个模板可以直接复制到项目里,然后根据你的网络接口替换 fetchData1/2 即可。

http://www.dtcms.com/a/333216.html

相关文章:

  • Nature Commun.:6GHz Ku波段无斜视波束成形!光子准TTD技术实现无限分辨率
  • 【Unity3D实例-功能-拔枪】角色拔枪(一)动态创建武器
  • 数据库SQL
  • FT61F145芯片解密-程序发展
  • 用 1 张 4090 复现 GPT-3.5?——单卡 24 GB 的「渐进式重计算」训练实践
  • 【秋招笔试】2025.08.15饿了么秋招机考-第三题
  • 【BLE系列-第四篇】从零剖析L2CAP:信道、Credit流控、指令详解
  • RK3588消费级8K VR一体机 是否有坑?
  • 【HarmonyOS】鸿蒙应用迁移实战指南
  • AI+脱口秀,笑点能靠算法创造吗
  • rem 适配方案
  • [论文阅读] 软件工程工具 | EVOSCAT可视化工具如何重塑软件演化研究
  • Autosar之CanNm模块
  • redis升级版本迁移数据
  • 一个集成多源威胁情报的聚合平台,提供实时威胁情报查询和播报服务、主动拦截威胁IP,集成AI等多项常用安全类工具
  • 非中文语音视频自动生成中文字幕的完整实现方案
  • 另类pdb恢复方式-2
  • RabbitMQ核心架构与应用
  • C++类与对象核心知识点全解析(下)
  • 《Python列表和元组:从入门到花式操作指南》
  • 系统介绍pca主成分分析算法
  • Kubernetes 集群镜像资源管理
  • 区块链:用数学重构信任的数字文明基石
  • clamav病毒检测
  • 【揭秘红黑树:高效数据结构解析】
  • I/O多路复用特性与实现
  • 全球鲜花速递市场:规模扩张、竞争格局与未来趋势解析
  • Python正则表达式处理Unicode字符完全指南:从基础到高级实战
  • Comfyui进入python虚拟环境
  • LangChain 与 LangGraph:如何选择合适的工具