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() // 取消所有挂起的任务}
}
模板亮点
生命周期绑定
viewModelScope
→ ViewModel 生命周期lifecycleScope
→ Activity/Fragment 生命周期
并发与串行
async + await
并行执行任务awaitAll
批量并发等待
异常处理
try-catch
捕获异常CoroutineExceptionHandler
处理协程未捕获异常SupervisorJob
隔离子协程异常
超时与取消
withTimeout
控制超时scope.cancel()
手动取消
响应式流
Flow
+map/filter/collect
这个模板可以直接复制到项目里,然后根据你的网络接口替换 fetchData1/2
即可。