Kotlin中如何等待任务完成?大数据过滤代码优化咨询
问题描述
我有如下处理API响应的函数:
internal fun handleResponse(items: List<TestItem>? = null) { viewModelScope.launch(Dispatchers.IO) { val isDataReturned = testItems != null // 此处存在笔误,应为items != null if (isDataReturned) { dataModelList = getfilterDataList(items).toMutableStateList() } requestCompleteLiveData.postValue(isDataReturned) } }
场景说明:通过API调用接收数据,数据可能为空,收到后传入handleResponse做过滤处理,其中getfilterDataList()是处理超1000条数据及子项的重过滤方法,定义如下:
fun getfilterDataList(unfilteredList: List<TestItem>): MutableList<DataModel> { return unfilteredList .asSequence() .mapNotNull { it.testData } .filterNot { isInvalidTestData(it) } .mapIndexed { index, testData -> // 内部包含更多数据转换逻辑 DataModel() }.toMutableList() }
现有dataModelList定义:
var dataModelList = mutableStateListOf<DataModel>()
需要优化代码满足以下要求:
- 若未返回数据(
isDataReturned为false),直接发送LiveData通知请求完成; - 若返回数据(
isDataReturned为true),必须等待dataModelList完成所有数据收集后,再发送LiveData通知。
优化后的实现方案
修正笔误+逻辑优化后的代码
internal fun handleResponse(items: List<TestItem>? = null) { viewModelScope.launch(Dispatchers.IO) { // 空数据直接分支处理,立即发送通知并结束协程 items ?: run { requestCompleteLiveData.postValue(false) return@launch } // 数据非空时,先完成所有过滤与数据收集 dataModelList = getfilterDataList(items).toMutableStateList() // 确保数据赋值完成后再发送请求完成通知 requestCompleteLiveData.postValue(true) } }
关键优化点说明
- 提前拦截空值逻辑:用
?: run直接处理空数据场景,减少嵌套分支,逻辑更简洁,避免后续不必要的代码执行; - 保证数据就绪再通知:数据非空时,先完整执行
getfilterDataList的过滤转换逻辑,将结果赋值给dataModelList后,再发送LiveData,确保UI收到通知时dataModelList已经准备好全部数据; - 修正原始代码笔误:将
testItems != null改为items != null,匹配函数入参,避免空指针或逻辑错误。
额外优化建议
如果getfilterDataList处理超大量数据时确实耗时,可以进一步优化集合转换步骤:直接在序列操作末尾生成MutableStateList,减少一次集合拷贝:
fun getfilterDataList(unfilteredList: List<TestItem>): MutableStateList<DataModel> { return unfilteredList .asSequence() .mapNotNull { it.testData } .filterNot { isInvalidTestData(it) } .mapIndexed { index, testData -> // 内部包含更多数据转换逻辑 DataModel() }.toMutableStateList() }
此时handleResponse中可直接写dataModelList = getfilterDataList(items),省略额外的toMutableStateList()调用。
内容的提问来源于stack exchange,提问作者Compose Learner
相关产品推荐
相关产品推荐

