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> = _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() // 取消所有挂起的任务
    }
}

模板亮点

  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 即可。