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

RxJava map操作符回调未执行?问题原因及解决方法

问题分析与解决

问题现象

调用api.getPlayerHtml接口后,后续的converter.parsePlaylists方法完全没有执行,调试断点也无法命中,但确认接口请求确实发起了。

核心原因

你将Retrofit接口的返回类型设为Single<String>,Retrofit会自动使用内置字符串转换器解析响应。如果接口返回的内容(比如HTML)不符合转换器的预期格式或编码,会静默抛出异常。而RxJava的Single在没有订阅错误回调的情况下,异常会被吞掉,导致整个数据流直接终止,后续的map操作自然不会执行。

解决方案

把接口的返回类型改为Single<ResponseBody>,手动在map中转换为字符串,完全控制响应读取过程:

1. 修改Retrofit接口定义

@GET
fun getPlayerHtml(@Url playerUrl: String): Single<ResponseBody>

2. 修改调用逻辑

private fun getVideoFiles(video: Video): Single<Video> =
    api.getPlayerHtml(video.player).map { responseBody ->
        // 手动读取响应内容为字符串,可按需添加异常捕获逻辑
        val htmlContent = responseBody.string()
        converter.parsePlaylists(htmlContent)
    }.map { converter.convertTracks(video, it) }

补充说明

使用ResponseBody可以绕开Retrofit的自动解析逻辑,避免因响应格式或编码不匹配导致的静默异常。另外建议在订阅这个Single时添加onError回调,方便排查后续可能出现的问题。

内容的提问来源于stack exchange,提问作者Alex Semeniuk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 21:45:02