整理了一个 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> = _data
private 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)
// 订阅 LiveData
viewModel.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
即可。