0
Fork 0
mirror of https://github.com/Silent1566/webhtv.git synced 2026-10-18 07:09:16 +00:00

修复:拖拽进度时加载中/网速大概率不显示

现象:拖动播放进度条后,加载圈(转圈+网速)基本不出现或一闪即没。

根因是本地 seek 专属进度控制与加载圈兜底之间的时序竞态:
CustomSeekView.onScrubStop -> seekListener.onSeekStarted() 先亮圈,showProgress()
随即 App.post(mR2/mR3, 0) 立刻投递网速 ticker,而 seek 命令要等这一跳之后才提交。
ticker 第一跳执行 hidePlaybackProgressIfStale(),此时引擎仍报 READY,于是把刚亮起的
圈收掉。次生缺口:onStateChanged(STATE_READY) 与 onControllerReadyReconciled() 也会
无条件收圈,引擎在 seek 生效前的那次 READY 读数同样收圈。

上游取证:webhtv/Silent1566 与 main 等全部分支均无 seek 专属窗口(onSeekStarted /
SeekListener / mSeekProgressFallback 命中数 0),上游的圈纯由 BUFFERING 状态驱动,
且上游没有本地 2839bb40955/4e303d30d34 这两个提交。故不照搬上游(无对应代码可摘,
回退到纯状态驱动会丢掉已交付的本地 seek 进度控制与加载圈兜底),而是按上游语义在本地
补上窗口这一环。

修法:seek 期间打开「最小可见 + 确实可收」窗口,无新增生产类。
- 新增 SEEK_PROGRESS_MIN_VISIBLE_MS = 1200L 与 mSeekProgressPending/StartedAtMs。
  取 1200ms 而非 500ms:网速读数由 PlaybackSpeedMeter 相邻两次采样的字节差算出,
  setTraffic 每秒一跳且每次 hideProgress 都 Traffic.reset() 重设基线,首跳必然空白,
  窗口盖不过一跳则圈虽停留、网速仍渲染不出来,只修到诉求的一半。
- onSeekStarted() 先开窗口再 showProgress()(顺序关键,后者会立刻投递 ticker),
  最后挂最小可见计时器。
- 新增 canHideSeekProgress():未开窗口放行;开着则要求已过最小可见时长、播放器有效、
  READY 且不在真实加载阻塞中(!isLoading() || isPlaying())。
- hidePlaybackProgressIfStale()(症状的直接执行者)、onStateChanged(READY)、
  onControllerReadyReconciled()、hideSeekProgressIfReady() 统一走该闸门。
- hideProgress() 同时关窗口(音频舞台路径借此自动收口);showProgress() 在窗口开着时
  不摘掉最小可见计时器。
- 曾写 200ms 重试后移除:网速 ticker 在圈可见期间本就每秒重判,自发重试会在播放器长期
  报 loading 时变成每秒 5 次的空转唤醒,故窗口收尾只保留计时器 + ticker 两条路径。

有意接受的代价(测试已锁定):缓冲内瞬时 seek 也会多显示约 0.7s 的圈,方向偏向「显示」
而非「不显示」,与诉求一致,不涉及功能或数据。

范围:仅两个 flavor 的 VideoActivity 与测试;未改 native/AAR/依赖/构建配置。
TmdbDetailActivity 内嵌播放器未覆写 onSeekStarted、加载态纯由 isLoading() 驱动,
不存在同款竞态,故未纳入。

Verification: 双 flavor arm64 Debug Java 编译 BUILD SUCCESSFUL;C47SeekLoadingProgressSourceTest 5x2=10、VideoActivityLayoutTest 154、PlaybackOwnershipSourceTest 15x2=30,合计 194 次用例执行 0 failure 0 error 0 skipped(真实执行);两处变异精确命中并已按 md5 恢复(删 hidePlaybackProgressIfStale 的 seek 闸门 -> '网速 ticker 不得收掉挂起的 seek' 变红;最小可见时长 1200->500 -> '须盖过一个网速采样间隔' 变红);git diff --check clean;全仓测试源集无其它用例钉住旧 500ms 形状;未做真机观感验收(本工作区分配的口 192.168.50.3:5561 多次连接被拒,其余端口属其它工作区未占用);未打正式包

Task-Guard: C47
This commit is contained in:
Silent1566 2026-10-08 19:50:03 +08:00
commit 23e5280f37
6 changed files with 391 additions and 22 deletions