Android Kotlin 协程

张开发
2026/5/3 10:29:45 15 分钟阅读
Android Kotlin 协程
Android Kotlin 协程总结表概念类型作用 / 概念使用场景示例Coroutine核心轻量级线程可挂起和恢复所有异步操作launch { ... }suspend function核心挂起函数必须在协程或挂起函数中调用网络请求、数据库操作suspend fun fetchData(): StringlaunchAPI启动协程不返回结果UI 事件触发、后台任务viewModelScope.launch { ... }async / awaitAPI启动协程可返回值并发任务、计算val result async { compute() }.await()withContextAPI切换线程/DispatcherIO 密集型或 CPU 密集型任务val data withContext(Dispatchers.IO) { fetch() }CoroutineScope核心协程作用域管理生命周期ViewModel / Activity / ComposableviewModelScope、lifecycleScopeJob核心协程生命周期句柄可取消、等待完成管理协程val job launch { ... }DeferredAPI带返回值的协程任务并发任务返回值val deferred async { compute() }; val result deferred.await()Dispatcher核心控制协程执行线程Main / IO / Default / UnconfinedDispatchers.Main/Dispatchers.IOSupervisorJobAPI子协程失败不取消父协程异常隔离CoroutineScope(SupervisorJob())CoroutineExceptionHandlerAPI全局协程异常处理错误日志、崩溃处理val handler CoroutineExceptionHandler { _, e - ... }lifecycleScopeScopeActivity/Fragment 生命周期绑定协程UI 相关异步任务lifecycleScope.launch { ... }viewModelScopeScopeViewModel 生命周期绑定协程ViewModel 内异步任务viewModelScope.launch { ... }rememberCoroutineScopeComposeCompose 内可安全启动协程Composable 内网络请求或事件监听val scope rememberCoroutineScope()Android Kotlin 协程使用示例合集1. launch (不返回值)// ViewModel 中 viewModelScope.launch { val data fetchData() println(Fetched: $data) } suspend fun fetchData(): String { delay(1000) return Hello World }2. async / await (返回值)viewModelScope.launch { val deferred async(Dispatchers.IO) { computeValue() } val result deferred.await() println(Result: $result) } suspend fun computeValue(): Int { delay(500) return 42 }3. withContext (切换线程)viewModelScope.launch { val data withContext(Dispatchers.IO) { fetchFromNetwork() } println(Data: $data) } suspend fun fetchFromNetwork(): String { delay(1000) return Network data }4. CoroutineExceptionHandler (异常处理)val handler CoroutineExceptionHandler { _, exception - println(Caught: ${exception.localizedMessage}) } viewModelScope.launch(handler) { throw RuntimeException(Test exception) }5. SupervisorJob (子协程异常不影响父)val scope CoroutineScope(SupervisorJob() Dispatchers.Default) scope.launch { launch { throw RuntimeException(Child failed) } println(Parent continues) }6. lifecycleScope (绑定 Activity/Fragment)// In Activity lifecycleScope.launch { val data fetchData() textView.text data }7. viewModelScope (绑定 ViewModel)class MyViewModel : ViewModel() { fun loadData() { viewModelScope.launch { val data fetchData() println(Loaded: $data) } } }8. rememberCoroutineScope (Compose 内部)Composable fun FetchButton(viewModel: MyViewModel) { val scope rememberCoroutineScope() Button(onClick { scope.launch { viewModel.loadData() } }) { Text(Fetch Data) } }9. 并发任务示例viewModelScope.launch { val deferred1 async(Dispatchers.IO) { fetchA() } val deferred2 async(Dispatchers.IO) { fetchB() } val results awaitAll(deferred1, deferred2) println(Results: $results) } suspend fun fetchA(): String { delay(500); return A } suspend fun fetchB(): String { delay(700); return B }10. Compose Flow Coroutine 集成Composable fun StatusScreen(viewModel: MyViewModel) { val status by viewModel.stateFlow.collectAsStateWithLifecycle(initial Idle) val scope rememberCoroutineScope() Column { Text(Status: $status) Button(onClick { scope.launch { viewModel.loadData() } }) { Text(Load) } } }

更多文章