如何让Kotlin异步网络请求函数获取数据后再返回,避免空响应?
问题分析
你的问题根源在于scope.launch会启动一个异步协程执行网络请求,而函数getNetworkResponse会直接在主线程中返回初始的空array,等协程里的网络请求完成后才会更新array,所以出现了先返回空数组、后拿到有效数据的情况。
解决方案
要让函数能返回有效数据,必须将它改为挂起函数(用suspend修饰),因为网络请求是耗时操作,无法同步立即返回结果。修改后的代码不需要全局变量,直接在挂起函数中等待网络请求完成后返回结果:
private suspend fun getNetworkResponse(): List<String> { val list = api.getVideo().data // 处理null情况,避免强制转换出现异常,同时过滤空值 return list?.mapNotNull { it?.url } ?: emptyList() }
调用方式
因为这是挂起函数,你必须在协程或者另一个挂起函数中调用它:
scope.launch { val validData = getNetworkResponse() Log.d(MY_TAG, "有效数据: $validData") // 在这里使用拿到的有效数据更新UI或执行其他逻辑 }
关键说明
- 移除全局变量
array:全局变量在异步场景下容易引发线程安全问题,直接在挂起函数中返回结果更安全简洁。 - 用
mapNotNull替代map+强制转换:避免因it?.url或list为null导致的类型转换异常,同时自动过滤掉null值,确保返回的是非空的List<String>。 - 挂起函数不会阻塞线程:它会在网络请求时挂起协程,等请求完成后恢复协程并返回结果,不会影响主线程的正常运行。
内容的提问来源于stack exchange,提问作者Dmitry Sergienko
相关产品推荐
相关产品推荐

