ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

my-tv 的播放错误处理与自动重试,到底是怎么运作的

my-tv 的播放错误处理与自动重试,到底是怎么运作的 my-tv 的播放错误处理与自动重试到底是怎么运作的【免费下载链接】my-tv我的电视 电视直播软件安装即可使用项目地址: https://gitcode.com/GitHub_Trending/my/my-tvmy-tv 是一个装好就能看的电视直播软件它背后藏着一套不太起眼的机制当直播拉流失败、网络抖一下、或者播放器突然报错时程序不会只是黑屏卡死而是会自己判断、自己重试、实在不行就换一条播放源。这篇文章想带你看看这套播放错误处理 自动重试的逻辑在代码里长什么样帮你理解它为什么大部分时候能自愈。它是怎么知道出错了错误识别这件事my-tv 分散在几个地方而不是靠单一入口。最核心的一处在播放器 Fragment 里ExoPlayer 的监听器会回调onPlayerError一旦播放抛异常这里就把异常记进日志并通知 ViewModel 状态变化。override fun onPlayerError(error: PlaybackException) { super.onPlayerError(error) Log.e(TAG, PlaybackException $error) tvViewModel?.changed() }简单说播放器自己喊了我出错了这段代码把它记下来并告诉上层该重新处理这个频道了。除了播放器内部还有两条线在盯着。一条是网络层主 Activity 里注册的网络回调 会在网络可用时累加一个就绪计数等所有 Fragment 和网络都准备好才真正开台另一条是请求层拉流请求失败时错误信息的 ViewModel 会把服务端返回的提示比如暂停提供直播信号存进errInfo交给界面去弹提示。有意思的是它对特殊设备做了区分。判断是否为天猫设备 的isTmallDevice()会让播放器换一种渲染容器避免某些盒子上直接闪退。换句话说怎么知道出错这件事my-tv 是从播放器、网络、请求、设备四个角度一起看的。出错后用户看到的是什么真正让用户有感的是两个轻量的界面。第一个是 Toast 轻提示。频道列表的 Fragment 会观察每个频道的errInfo当它是当前正在看的这个频道时就把服务端给的错误文案弹出来。这种提示不打断观看适合版权方暂停信号这类临时情况。第二个是全屏的错误页实现是继承自 Leanback 的 错误提示 Fragmentinternal 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() } }这段代码做的是配一个难过云朵图标、一段文字说明再加一个关闭按钮点了就把整个错误页从界面上摘掉。它的文案和按钮文字都放在 字符串资源文件 里所以改提示词、做多语言都只动那一处。还有个贴心的细节错误页不是死的。主 Activity 里 只要播放器重新进入播放状态错误页就会自动被移除——也就是说一旦重试成功、画面恢复提示自己就消失了不用用户去点。重试到底发生在哪上限又是多少自动重试的主战场在 请求与拉流逻辑。你会发现这里的模式非常统一每次请求不管是拿 token、拿鉴权还是拿播放地址失败后都会先判断一个计数器——if (tvModel.retryTimes tvModel.retryMaxTimes) { tvModel.retryTimes // 根据频道是否需要 token决定重新走哪条分支 }翻译成大白话先问我试了几次了没超上限就加一、再试一次超过就不再硬试避免把服务器打爆。这个上限具体是多少写在 每个频道的 ViewModel 里默认是 8 次retryMaxTimes 8普通拉流失败的重试上限tokenFHRetryMaxTimes 8港澳台这类需要鉴权的频道走鉴权失败重试的上限。这两个数字想调直接改 ViewModel 里对应的字段就行不用去碰复杂的请求逻辑。另外还有一组每分钟心跳的保活请求拉流成功后每 60 秒跑一次上报它让播放地址保持活跃某种程度上也是预防出错的一环。重试没救回来时它还能做什么重试次数用完还不行my-tv 没有放弃而是转向换一条路走。最直接的兜底是回看即重播。播放器 Fragment 的 onStart 里做了一件很简单的事if (playerView ! null playerView!!.player?.isPlaying false) { playerView!!.player?.prepare() playerView!!.player?.play() }意思是每次界面回到前台只要发现播放器没在播就重新 prepare 并 play。所以很多切回去发现没声了的情况你切回来一下它自己就好了根本不用管它是不是出过错。另一条路是备用播放源。每个频道在数据里其实带着一组播放地址videoUrlViewModel 用videoIndex记住当前播的是第几条getVideoUrlCurrent()每次取索引对应的地址。列表 Fragment 里还提供了上一路/下一路源的切换方法当某一路地址失效时换索引再拉就能绕开坏掉的源。最后给几句实用建议如果某频道一直转圈不出画面先切走再切回来触发重播或换一路播放源想看它到底卡在哪一步日志里搜Request、TVViewModel、PlaybackVideoFragment这几个 tag 基本能定位到是网络、token 还是播放器本身的问题。整套机制的思路其实就一句话——能自己恢复的交给状态回调恢复不了就重试加换源最后才把提示交给人。【免费下载链接】my-tv我的电视 电视直播软件安装即可使用项目地址: https://gitcode.com/GitHub_Trending/my/my-tv创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表