使用R4J调用Riot API获取比赛列表异常:正常运行返回空列表
问题分析与解决办法
你遇到的情况大概率是异步操作未等待完成就获取结果导致的:调试模式下步进执行会给异步请求足够的时间完成,所以能拿到数据;但正常运行时代码不会等待异步操作结束,直接去读结果自然是空列表。
具体解决步骤
- 先确认
getMatchList方法的返回值类型:R4J的大部分API是异步实现,返回的是CompletableFuture(Java风格异步类型)或者支持Kotlin协程的异步对象。 - 如果用Kotlin协程,在协程作用域内用
await()等待结果完成:// 示例:在runBlocking或ViewModel的viewModelScope等协程域中执行 val matchList = r4j.loLAPI.matchAPI.getMatchList(RegionShard.EUROPE, summoner.puuid).await() // 此处处理matchList即可获取到有效数据 - 如果用Java风格的
CompletableFuture,直接用join()阻塞等待结果:val matchFuture = r4j.loLAPI.matchAPI.getMatchList(RegionShard.EUROPE, summoner.puuid) val matchList = matchFuture.join()
额外排查点
- 可以添加日志打印请求的响应状态码,排除Riot API速率限制的问题(虽然调试能拿到数据的话概率较低,但正常运行时短时间高频请求可能触发限制)。
- 检查是否有异常被吞掉:异步操作抛出异常但未捕获时,可能导致结果为空。可以给Future添加异常监听:
matchFuture.exceptionally { e -> e.printStackTrace() null }
内容的提问来源于stack exchange,提问作者Martim Gouveia
相关产品推荐
相关产品推荐

