From cdd8676a1dbfdd294100c4ba9c4b2706582e0bc7 Mon Sep 17 00:00:00 2001 From: jjangddu Date: Tue, 7 Jul 2026 17:25:10 +0900 Subject: [PATCH] =?UTF-8?q?fix(posture):=20=EB=8F=84=EB=84=9B=EC=B0=A8?= =?UTF-8?q?=ED=8A=B8=20posture=20chip=20'=EA=B0=90=EC=A7=80=20=EC=A4=91'?= =?UTF-8?q?=20=EB=AC=B4=ED=95=9C=20=EC=9C=A0=EC=A7=80=20=EB=B2=84=EA=B7=B8?= =?UTF-8?q?=20=EB=B3=B5=EA=B5=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 증상: 도넛차트 페이지 진입 시 posture chip 이 계속 '감지 중' 만 표시. Logcat 확인 결과: - LaunchedEffect 는 실행됨 (isConnected=true, isDemoMode=false) - imuCollector.parseRim 은 매 초 성공 (`rim: 15 samples parsed`) - 그런데 POSTURE 로그가 하나도 안 뜸 → onComplete 콜백이 null 상태 원인: DisposableEffect onDispose 안의 `imuCollector.onComplete = null`. Compose 가 fragment hidden→visible 전환 또는 tab-navigation 재구성 시점에 예상 못한 timing 으로 onDispose 를 실행하는 경우, 콜백이 LaunchedEffect 세팅 직후 즉시 null 로 덮여 이후 rim 이 와도 실행 안 됨. 수정: DisposableEffect 에서 imuCollector.onComplete / piezoCollector. onMultiChannelComplete null 정리를 제거. 다음 진입 시 자기 LaunchedEffect 가 어차피 자기 콜백으로 덮어쓰므로 stale 콜백은 실질 무해. BleManager 콜백 3개 (onConnectionStateChanged 등) 는 좀비 세션 방지 위해 정리 유지. Co-Authored-By: Claude Opus 4.7 --- .../vesiscan/ui/views/monitoring/PiezoMonitoringView.kt | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/medithings/vesiscan/ui/views/monitoring/PiezoMonitoringView.kt b/app/src/main/java/com/medithings/vesiscan/ui/views/monitoring/PiezoMonitoringView.kt index 64dae3c..3791d57 100644 --- a/app/src/main/java/com/medithings/vesiscan/ui/views/monitoring/PiezoMonitoringView.kt +++ b/app/src/main/java/com/medithings/vesiscan/ui/views/monitoring/PiezoMonitoringView.kt @@ -866,8 +866,12 @@ fun PiezoMonitoringView(appState: AppState) { // 이탈 후에도 GC 방해 + 이후 다시 진입 시 stale closure 가 새 상태를 오염시킬 위험. androidx.compose.runtime.DisposableEffect(Unit) { onDispose { - bleManager.imuCollector.onComplete = null - bleManager.piezoCollector.onMultiChannelComplete = null + // 2026-07-07 fix: imuCollector.onComplete null 정리 제거. Compose 가 + // fragment hidden→visible 전환 등에서 예상 못한 timing 으로 onDispose 를 + // 실행하는 경우 콜백이 세팅 직후 즉시 null 로 덮여 posture 표시 안 되는 + // 현상 발견. 다음 진입 시 LaunchedEffect(isConnected, isDemoMode) 가 자기 + // 콜백으로 다시 덮어쓰므로 stale 콜백은 실질 무해. + // piezoCollector 도 동일 이유로 정리 제거. bleManager.onConnectionStateChanged = null bleManager.onUnexpectedDisconnect = null bleManager.onReconnectionFailed = null