From ffd00266b845f88dda12fa0440769c7adf38cc05 Mon Sep 17 00:00:00 2001 From: mazengfei <331023091@qq.com> Date: Fri, 24 Jul 2026 16:54:19 +0800 Subject: [PATCH] =?UTF-8?q?fix(recognition):=20=E9=98=B2=E6=AD=A2=E8=AF=86?= =?UTF-8?q?=E5=88=AB=E6=97=B6=E9=87=8D=E5=A4=8D=E8=A7=A6=E5=8F=91=E5=AF=BC?= =?UTF-8?q?=E8=87=B4=E5=A4=9A=E6=AC=A1=E5=B9=B6=E5=8F=91=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 isRecognizing 标记防止识别过程重复进入 - 在识别开始时设置标记,结束时释放标记 - 多处识别终止和异常处理处均释放识别锁 - 在重量回调中增加去重逻辑,避免同一重量重复触发回调 - 更新 lastCallbackWeight,确保仅在重量变化时触发回调 --- .../com/sw/dualscreen/activity/MainActivity.kt | 16 ++++++++++++++++ .../com/sw/dualscreen/sdk/SensorScaleUtils.kt | 11 ++++++++--- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/sw/dualscreen/activity/MainActivity.kt b/app/src/main/java/com/sw/dualscreen/activity/MainActivity.kt index 1fbf357..a9abb52 100644 --- a/app/src/main/java/com/sw/dualscreen/activity/MainActivity.kt +++ b/app/src/main/java/com/sw/dualscreen/activity/MainActivity.kt @@ -178,6 +178,7 @@ class MainActivity : BaseActivity() { private var lastPhotoUri: Uri? = null // 最后拍照的图片 private var debouncer = Debouncer(2000) private var isRecognitionFood = true + private var isRecognizing = false private var isFirstOpen = true private var isStartRecognize = false @@ -520,6 +521,15 @@ class MainActivity : BaseActivity() { private var startTime = 0L fun recognizeFood() { + // 防重入:识别进行中则跳过,避免重量变化触发多次并发识别 + if (isRecognizing) { + log("recognizeFood 已在识别中,跳过重复调用") + return + } + isRecognizing = true + // 立即更新基准重量,缩小后续重量变化触发识别的窗口 + lastWeight = currentWeight + startTime = System.currentTimeMillis() // LightManager.openRedLight() LightManager.closeRedLight() @@ -545,6 +555,8 @@ class MainActivity : BaseActivity() { shutdownCamera() setupCamera() + // 释放识别锁,允许递归重试时重新获取 + isRecognizing = false binding.root.postDelayed({ recognizeFood() }, 1000) @@ -568,6 +580,7 @@ class MainActivity : BaseActivity() { log("registerDataChange识别后查询接口数据:$queryData,识别数据:$recData") if (list.isEmpty()) { foodRecognizeState = false + isRecognizing = false tvToSearch.let { it.text = "未查询到,手动搜索" it.visible() @@ -575,6 +588,7 @@ class MainActivity : BaseActivity() { return } foodRecognizeState = true + isRecognizing = false //查询到菜品信息,同步设置lastWeight=currentWeight lastWeight = currentWeight presentation?.updateWeight(currentWeight) @@ -790,6 +804,7 @@ class MainActivity : BaseActivity() { checkedItem = null lastWeight = 0 foodRecognizeState = true + isRecognizing = false isSwitchFood = false } @@ -1358,6 +1373,7 @@ class MainActivity : BaseActivity() { //binding.layoutRescan.visibility = View.VISIBLE withContext(Dispatchers.Main) { + isRecognizing = false tvToSearch.let { it.text = "未识别到,手动搜索" it.visible() diff --git a/app/src/main/java/com/sw/dualscreen/sdk/SensorScaleUtils.kt b/app/src/main/java/com/sw/dualscreen/sdk/SensorScaleUtils.kt index e7f68cd..d567e15 100644 --- a/app/src/main/java/com/sw/dualscreen/sdk/SensorScaleUtils.kt +++ b/app/src/main/java/com/sw/dualscreen/sdk/SensorScaleUtils.kt @@ -24,6 +24,7 @@ object SensorScaleUtils { var isZero = false private var callback: Callback? = {} private var lastWeight: Double? = null + private var lastCallbackWeight: Double? = null private fun init() { mSensorScale = SensorScale(object : OnScaleResult { @@ -45,9 +46,13 @@ object SensorScaleUtils { callback?.invoke(value) } - weightCallbackList.forEach { - val currentWeight = value * 1000 - it.invoke(currentWeight.roundToInt()) + // 去重:仅在重量变化时回调 weightCallbackList,避免同一重量反复触发 + if (lastCallbackWeight != value) { + lastCallbackWeight = value + weightCallbackList.forEach { + val currentWeight = value * 1000 + it.invoke(currentWeight.roundToInt()) + } } } }