Android Kotlin 協程的詳細使用指南,結合核心概念、實戰場景和最佳實踐:
一、協程基礎概念
?協程本質?
協程是輕量級線程,通過掛起/恢復機制實現并發,相比線程節省90%以上的內存開銷。其核心優勢在于結構化并發和掛起函數的協作式調度?。?關鍵組件?
- ?CoroutineScope?:生命周期綁定的作用域(如
viewModelScope
) - ?Dispatcher?:調度器(IO/Default/Main/Unconfined)
- ?Job?:控制協程任務的生命周期
- ?掛起函數?:用
suspend
標記的可暫停函數?
- ?CoroutineScope?:生命周期綁定的作用域(如
二、基礎使用場景
1. 網絡請求封裝
viewModelScope.launch(Dispatchers.IO) {
try {
val data = repository.fetchData() // suspend函數
withContext(Dispatchers.Main) {
updateUI(data)
}
} catch (e: Exception) {
handleError(e)
}
}
?要點?:
- 使用
viewModelScope
自動取消避免內存泄漏 - IO線程執行網絡請求,Main線程更新UI?34
2. 并發任務組合
val userData = async { getUser() }
val newsFeed = async { getFeed() }
showContent(userData.await(), newsFeed.await())
通過async/await
實現并行請求?
三、高級特性
1. 結構化并發
coroutineScope {
launch { task1() }
launch { task2() } // 任一子協程失敗會取消整個作用域
}
?優勢?:自動傳播取消操作和異常?
2. 異常處理
supervisorScope {
val child1 = launch { /* 失敗不影響其他子協程 */ }
val child2 = launch(CoroutineExceptionHandler { _, e -> log(e) }) {
/* 單獨處理異常 */
}
}
?注意?:
SupervisorJob
隔離子協程異常- 全局異常處理器需配合使用?
四、性能優化技巧
?調度器選擇?
- CPU密集型:
Dispatchers.Default
- 文件/數據庫:
Dispatchers.IO
(支持64線程并行) - 主線程操作:
Dispatchers.Main.immediate
?
- CPU密集型:
?避免阻塞?
使用withTimeout
限制耗時操作:withTimeout(3000) { fetchFromNetwork() // 超時自動取消 }
五、常見問題解決方案
?內存泄漏?
使用lifecycleScope
或viewModelScope
自動綁定生命周期?3?線程阻塞?
將阻塞調用(如Room操作)包裝為suspend
函數:suspend fun queryDb() = withContext(Dispatchers.IO) { db.query() }
通過合理使用協程的掛起機制、結構化并發和調度策略,可以顯著提升Android應用的響應速度和資源利用率。