You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 12:31:09