fix(posture): 도넛차트 posture chip '감지 중' 무한 유지 버그 복구

증상:
도넛차트 페이지 진입 시 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 <noreply@anthropic.com>
This commit is contained in:
2026-07-07 17:25:10 +09:00
parent 0ab273e750
commit cdd8676a1d
@@ -866,8 +866,12 @@ fun PiezoMonitoringView(appState: AppState) {
// 이탈 후에도 GC 방해 + 이후 다시 진입 시 stale closure 가 새 상태를 오염시킬 위험. // 이탈 후에도 GC 방해 + 이후 다시 진입 시 stale closure 가 새 상태를 오염시킬 위험.
androidx.compose.runtime.DisposableEffect(Unit) { androidx.compose.runtime.DisposableEffect(Unit) {
onDispose { onDispose {
bleManager.imuCollector.onComplete = null // 2026-07-07 fix: imuCollector.onComplete null 정리 제거. Compose 가
bleManager.piezoCollector.onMultiChannelComplete = null // fragment hidden→visible 전환 등에서 예상 못한 timing 으로 onDispose 를
// 실행하는 경우 콜백이 세팅 직후 즉시 null 로 덮여 posture 표시 안 되는
// 현상 발견. 다음 진입 시 LaunchedEffect(isConnected, isDemoMode) 가 자기
// 콜백으로 다시 덮어쓰므로 stale 콜백은 실질 무해.
// piezoCollector 도 동일 이유로 정리 제거.
bleManager.onConnectionStateChanged = null bleManager.onConnectionStateChanged = null
bleManager.onUnexpectedDisconnect = null bleManager.onUnexpectedDisconnect = null
bleManager.onReconnectionFailed = null bleManager.onReconnectionFailed = null