From a757474b06463ecbc71b6ad0a89a59c8354ae25e Mon Sep 17 00:00:00 2001 From: QIU Date: Fri, 14 Aug 2026 11:24:01 +0000 Subject: [PATCH] =?UTF-8?q?fix(radar):=20=E8=BF=87=E5=A2=83=E7=BB=93?= =?UTF-8?q?=E6=9D=9F=E5=90=8E=E8=87=AA=E5=8A=A8=E5=88=87=E6=8D=A2=E5=88=B0?= =?UTF-8?q?=E4=B8=8B=E4=B8=80=E4=B8=AA=E8=BF=87=E5=A2=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根因: collectPassAndStartTickLoop() 启动时调用 findCurrentPass() 获取当前过境, 之后进入 while(isActive) 循环每秒 tickPass(),但从不重新检查过境是否结束。 结果:过境 LOS 后雷达页面继续显示旧卫星位置(冻结在地平线),用户必须 手动返回过境列表重新点击下一个过境。 触发条件: 1. 用户在过境进行中打开雷达页面 2. 过境结束时用户仍停留在雷达页面 3. passes 列表中存在后续过境 修复: 每次 tick 开始时检查 timeNow > pass.losTime,如果过境已结束则调用 findCurrentPass() 查找下一个过境。findCurrentPass() 的三级回退逻辑 (精确匹配 → 时间窗口 → 同卫星 → 第一个)保证能拿到合理的下一个过境。 如果找到且与当前 pass 不同,则重新 loadPassData() 加载新过境的电台和轨迹。 影响: 雷达页面现在会无缝切换到下一个过境,用户体验接近实时卫星跟踪软件。 如果 passes 列表为空(所有过境都结束),页面保持最后状态不崩溃。 --- .../look4sat/feature/radar/RadarViewModel.kt | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/feature/radar/src/main/java/com/rtbishop/look4sat/feature/radar/RadarViewModel.kt b/feature/radar/src/main/java/com/rtbishop/look4sat/feature/radar/RadarViewModel.kt index f11ca8df..7671dab5 100644 --- a/feature/radar/src/main/java/com/rtbishop/look4sat/feature/radar/RadarViewModel.kt +++ b/feature/radar/src/main/java/com/rtbishop/look4sat/feature/radar/RadarViewModel.kt @@ -127,9 +127,18 @@ class RadarViewModel( private fun collectPassAndStartTickLoop() { viewModelScope.launch { - val pass = findCurrentPass() ?: return@launch - val allRadios = loadPassData(pass) + var pass = findCurrentPass() ?: return@launch + var allRadios = loadPassData(pass) while (isActive) { + val timeNow = System.currentTimeMillis() + // If current pass has ended, switch to next pass + if (timeNow > pass.losTime) { + val nextPass = findCurrentPass() + if (nextPass != null && nextPass != pass) { + pass = nextPass + allRadios = loadPassData(pass) + } + } tickPass(pass, allRadios) delay(1000.milliseconds) }