From 87ca6abe1b3d7a9db32bccf87e15c62459197c85 Mon Sep 17 00:00:00 2001 From: lvmeng <848755140@qq.com> Date: Mon, 18 May 2026 16:05:26 +0800 Subject: [PATCH] =?UTF-8?q?fix(init):=20=E8=A7=A3=E5=86=B3Activity?= =?UTF-8?q?=E5=90=AF=E5=8A=A8=E6=97=B6=E5=BA=8F=E7=AB=9E=E6=80=81=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将finish()调用延迟到下一帧执行,避免与LaunchActivityItem事务竞态 - 修复"Activity client record must not be null"偶发崩溃问题 - 将goSampling方法改为suspend函数确保协程串行执行 - 保证startActivity在finish()之前完成,防止页面跳转失败 --- .../com/shuwei/dish/match/ui/InitActivity.kt | 47 +++++++++++-------- 1 file changed, 27 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/com/shuwei/dish/match/ui/InitActivity.kt b/app/src/main/java/com/shuwei/dish/match/ui/InitActivity.kt index f8e8a61..1eb0052 100644 --- a/app/src/main/java/com/shuwei/dish/match/ui/InitActivity.kt +++ b/app/src/main/java/com/shuwei/dish/match/ui/InitActivity.kt @@ -93,7 +93,9 @@ class InitActivity : BaseActivity() { // 子设备:直接进入小屏专属页面,不走原有大屏业务流程 if (GlobalData.deviceRole == DeviceRole.SLAVE) { startActivity() - finish() + // 延迟到下一帧 finish,避免与 LaunchActivityItem 事务竞态导致 + // "Activity client record must not be null" 偶发崩溃 + window.decorView.post { finish() } return@launch } // 主设备:走原有路由逻辑 @@ -110,28 +112,33 @@ class InitActivity : BaseActivity() { startActivity() } } - finish() + // 延迟到下一帧 finish,避免与 LaunchActivityItem 事务竞态导致 + // "Activity client record must not be null" 偶发崩溃 + window.decorView.post { finish() } } } - private fun goSampling() { - lifecycleScope.launch { - val slots = dbViewModel.loadSeasoningSlot() - if (slots.isEmpty()) { - // 无调料信息,打开采样历史列表页面,点击设置配置调料信息 - startActivity() - return@launch - } - val count = dbViewModel.countCookFood(cookMode = 1) - if (count > 0) { - // 有烹饪中数据,打开采样历史列表页面 - startActivity() - return@launch - } - // 无烹饪数据,打开新增采样页面 - startActivity { - putExtra(PrepareFoodActivity.PAGE_FROM, PrepareFoodActivity.HOME) - } + /** + * 采样模式启动路由:根据本地调料配置和烹饪中数据决定跳转目标 + * 改为 suspend 后由外层协程串行等待,保证 startActivity 早于 finish() 执行, + * 避免内部再嵌一层 lifecycleScope.launch 导致 finish 抢跑、跳转失败 + */ + private suspend fun goSampling() { + val slots = dbViewModel.loadSeasoningSlot() + if (slots.isEmpty()) { + // 无调料信息,打开采样历史列表页面,点击设置配置调料信息 + startActivity() + return + } + val count = dbViewModel.countCookFood(cookMode = 1) + if (count > 0) { + // 有烹饪中数据,打开采样历史列表页面 + startActivity() + return + } + // 无烹饪数据,打开新增采样页面 + startActivity { + putExtra(PrepareFoodActivity.PAGE_FROM, PrepareFoodActivity.HOME) } }