新闻详情

新闻详情

首页 / 资讯中心 / 详情

拆解 my-tv 播放失败的恢复链路:8 次重取与 3 条错误路径

发布时间:2026/9/2 9:58:02来源:尧图网络
拆解 my-tv 播放失败的恢复链路:8 次重取与 3 条错误路径
拆解 my-tv 播放失败的恢复链路:8 次重取与 3 条错误路径【免费下载链接】my-tv我的电视 电视直播软件安装即可使用项目地址: https://gitcode.com/GitHub_Trending/my/my-tv打开直播频道,画面停在黑屏,弹出状态错误或网络错误,重按一次又好了。my-tv 的错误恢复由三条独立链路组成,各有独立计数器、各自的重试边界,失败时有的弹窗有的静默,搞混了排查方向就错了。错误检测链路:从 PlaybackException 到错误页播放器异常从哪个回调抛出播放侧唯一的异常入口是 Player.Listener 的 onPlayerError,定义在 PlayerFragment.kt。回调只干两件事:打日志、通知 ViewModel:override fun onPlayerError(error: PlaybackException) { super.onPlayerError(error) Log.e(TAG, PlaybackException $error) tvViewModel?.changed() }changed()本身不带任何错误信息,真正的恢复动作在 MainFragment.kt 的 change 观察者里:重新走Request.fetchData拉取地址后再次play(),即错误即重取,而不是在本地重播。两条独立的失败入口会落到同一张错误页MainActivity.kt 的onRequestFinished是错误页的唯一挂入口,message非空才弹:override fun onRequestFinished(message: String?) { if (message ! null !errorFragment.isVisible) { supportFragmentManager.beginTransaction() .add(R.id.main_browse_fragment, errorFragment) .commitNow() errorFragment.setErrorContent(message) } fragmentReady(Request) }会传非空 message 的来源只有 Request.kt 的fetchInfoV2:token 拉取状态码异常传状态错误,请求失败传网络错误。另一条文案应版权方要求,暂停提供直播信号不走错误页,而是经setErrInfo进errInfoLiveData,由 MainFragment 以 Toast 提示,且仅当出错频道正是当前选中频道时才显示。用户看到的只有一个按钮,关掉错误页的兜底在 Activity 层ErrorFragment.kt 继承ErrorSupportFragment,用 leanback 自带的lb_ic_sad_cloud图标、黑色背景、按钮文案取R.string.dismiss_error:internal fun setErrorContent(message: String) { imageDrawable ContextCompat.getDrawable( context!!, androidx.leanback.R.drawable.lb_ic_sad_cloud) this.message message buttonText resources.getString(R.string.dismiss_error) buttonClickListener View.OnClickListener { fragmentManager!!.beginTransaction().remove(thisErrorFragment).commit() } }按钮只移除自身、不重试,恢复靠下一条链路自动完成。MainActivity.kt 里还有一处兜底:一旦真正开始播放,若错误页还挂着就顺手移除:fun isPlaying() { if (errorFragment.isVisible) { supportFragmentManager.beginTransaction() .remove(errorFragment).commit() } }重试机制:四个计数器各自设了哪些边界8 次上限设在哪,什么时候归零重取上限定义在 TVViewModel.kt,每个频道一份,随频道切换天然隔离:var retryTimes 0 var retryMaxTimes 8 var tokenFHRetryTimes 0 var tokenFHRetryMaxTimes 8Request.kt 中fetchAuth/fetchVideo的每一个onResponse失败分支和onFailure都走同一套逻辑:计数器加一后在 Retrofit 回调里递归重发,中间没有延时。每次重发前先cancelCall()掐掉在途请求,防止旧回调和新一轮交叉。地址成功到手那行tvModel.retryTimes 0把计数归零,所以 8 次是每次拉地址尝试的预算,不是全局配额。港澳台频道用的是另一组计数fetchData开头按频道分流,channel 港澳台直接进fetchFAuth:fun fetchData(tvModel: TVViewModel) { if (tvModel.getTV().channel 港澳台) { fetchFAuth(tvModel) return } ... }该链路用tokenFHRetryTimes / tokenFHRetryMaxTimes(同样 8 次)独立计数,拿到live_url后归零,与央视频 token 链路的retryTimes互不干扰。一个上限被设成 0 的死分支tokenYSPRetryMaxTimes初始为 0。凡是需要刷新 token 的分支,判断tokenYSPRetryTimes tokenYSPRetryMaxTimes永远不成立,直接落到mustToken的 else 侧,用不带vusession的 cookie 重发fetchAuth:if (needToken tvModel.tokenYSPRetryTimes tvModel.tokenYSPRetryMaxTimes) { tvModel.tokenYSPRetryTimes tvModel.needGetToken true fetchAuth(tvModel) } else { if (!tvModel.getTV().mustToken) { fetchAuth(tvModel, cookie) } }所以改 token 重试上限要动 TVViewModel.kt 的字段,改 Request.kt 里的判断不会生效。恢复路径:静默重取与前台自动重播黑屏后为什么没有任何提示onPlayerError只打日志和触发changed(),不弹窗、不 Toast;8 次重取耗尽后同样只停,不提示。用户感知到的错误只有启动期 token 失败那一类。这意味着排查播放失败必须读 Log 里 TAG 为PlaybackVideoFragment和Request的输出,界面上什么都看不到。天猫魔盒为什么换渲染路径Utils.kt 里isTmallDevice()只比较Build.MANUFACTURER Tmall,PlayerFragment.kt 据此二选一:if (Utils.isTmallDevice()) { _binding!!.playerView.visibility View.GONE surfaceView _binding!!.surfaceView surfaceHolder.addCallback(this) } else { _binding!!.surfaceView.visibility View.GONE playerView _binding!!.playerView }魔盒走裸SurfaceViewSimpleExoPlayer,由surfaceCreated时建播放器并setVideoSurfaceHolder;其余设备走 media3 的PlayerView。同一套 URL 逻辑挂两个播放器上,排查设备相关问题前先确认走的是哪条渲染路径。前台恢复后的自动重播靠生命周期对偶onPause里对正在播放的播放器执行stop(),onStart检测到isPlaying false就prepare()play():override fun onStart() { super.onStart() if (playerView ! null playerView!!.player?.isPlaying false) { playerView!!.player?.prepare() playerView!!.player?.play() } ... }应用回前台即自动续播,不依赖任何错误事件。启动期同理,用ready计数卡门槛:网络回调、5 个 Fragment 各自调fragmentReady()加一,ready 6才调mainFragment.fragmentReady()拉起首个频道;N 以上设备的网络就绪要等registerDefaultNetworkCallback的onAvailable回调才计入。常见坑点tokenYSPRetryMaxTimes初值为 0,token 刷新分支是死代码,调上限要改 TVViewModel.kt 的字段而非 Request.kt 的判断。onPlayerError不弹任何提示,8 次重取耗尽后只停在日志里,排查播放失败不能只看界面。手动切源的nextSource/prevSource在 MainActivity.kt 中已被注释,多地址列表实际靠错误重取驱动,而不是手势切换。ready 6在网络不可用时可能一直凑不齐,启动卡在加载态;先看 Log 里ready $tag $ready停在哪个 tag。NetworkChangeReceiver的onReceive实际是空的,网络感知以 MainActivity 里的registerDefaultNetworkCallback为准。排查播放失败,从 Request.kt 的fetchData入口顺计数器读起,比从 UI 层倒推更快。【免费下载链接】my-tv我的电视 电视直播软件安装即可使用项目地址: https://gitcode.com/GitHub_Trending/my/my-tv创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

ZYNQ自定义AXI-FULL IP核设计:实现PS与PL双向高速数据交互 2026/9/2 10:40:11

ZYNQ自定义AXI-FULL IP核设计:实现PS与PL双向高速数据交互

简介:本资源是面向ZYNQ SoC开发者与FPGA高级工程师的实战型工程包,聚焦PS与PL间高速双向通信这一核心难点,提供基于AXI-FULL协议的自定义IP完整实现方案。资源包含1261个文件,涵盖277个C头文件、221个C源码、78个Verilog模块&…

阅读更多 →
RM3100地磁传感器I2C驱动开发:从寄存器配置到跨平台移植实战 2026/9/2 10:40:11

RM3100地磁传感器I2C驱动开发:从寄存器配置到跨平台移植实战

简介:本资源是一套面向嵌入式开发工程师与单片机学习者的RM3100地磁传感器IC接口驱动源码工程,解决磁场数据采集、校准与转换等核心开发难题,适用于智能导航、电子罗盘、姿态感知等典型应用场景。压缩包共358个文件,957KB&#xf…

阅读更多 →
STM32 LIN开发全链路:CubeMX配置、LDF解析与CANoe测试 2026/9/2 10:40:11

STM32 LIN开发全链路:CubeMX配置、LDF解析与CANoe测试

简介:本资源是一个基于STM32CubeMX配置的LIN总线通信测试工程模板,面向嵌入式初学者及汽车电子开发人员,解决LIN协议在STM32平台上的快速入门与工程搭建难题。压缩包共603个文件,涵盖336个C源码、104个头文件(.h&#…

阅读更多 →
Go性能优化实战:基于Profile-Guided Optimization的数据驱动编译优化 2026/9/2 10:40:11

Go性能优化实战:基于Profile-Guided Optimization的数据驱动编译优化

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
TM1638与TM1629D共阳数码管驱动:从芯片差异到代码实现全解析 2026/9/2 10:40:11

TM1638与TM1629D共阳数码管驱动:从芯片差异到代码实现全解析

简介:本资源是一套面向嵌入式初学者与STM32开发者的TM1629D/TM1638共阳数码管驱动实战代码,聚焦解决STM32F030微控制器驱动多位共阳数码管、LED指示灯及按键扫描的核心问题,适用于电子钟、工业面板、教学实验等低功耗显示控制场景。压缩包仅含…

阅读更多 →
Next AI Draw.io 完整指南:3 步接入 AI 绘图 API,用自然语言快速生成智能图表 2026/9/2 10:37:10

Next AI Draw.io 完整指南:3 步接入 AI 绘图 API,用自然语言快速生成智能图表

Next AI Draw.io 完整指南:3 步接入 AI 绘图 API,用自然语言快速生成智能图表 【免费下载链接】next-ai-draw-io A next.js web application that integrates AI capabilities with draw.io diagrams. This app allows you to create, modify, and enhan…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞