From 3179aac5130f150e00d3ffd0e1071c6196c7d471 Mon Sep 17 00:00:00 2001 From: jjangddu Date: Fri, 12 Jun 2026 10:17:53 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20BLE=20autoReconnect=20=EB=AC=B4=ED=95=9C?= =?UTF-8?q?=20=EB=A3=A8=ED=94=84=20=E2=80=94=20max=2010=ED=9A=8C=20?= =?UTF-8?q?=EC=8B=9C=EB=8F=84=20=ED=9B=84=20=ED=8F=AC=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 증상: demo APK 에서 한 번 BLE 연결 후 disconnect → autoReconnect 가 8초 간격으로 영원히 재시도 → isReconnecting=true 영구 유지 → Clinical Home 진입 시 "BLE Connecting..." 무한 로딩. 원인: scheduleAutoReconnect 가 SCAN_TIMEOUT 마다 자기 자신을 재호출. 종료 조건은 (1) 실제 연결 (2) Bluetooth disabled 뿐. 수정: - MAX_RECONNECT_ATTEMPTS = 10 상수 (≈ 100~120초 동안 시도) - attemptAutoReconnect 진입 시 카운트 체크 → 초과 시 isReconnecting=false, reconnectAttempt 초기화, 콜백 invoke - 사용자가 ClinicalHome 의 [Connect] 버튼 또는 DeviceScan 재진입 으로 명시적 재시도 가능. --- .../com/example/medilightv2android/ble/BleManager.kt | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/app/src/main/java/com/example/medilightv2android/ble/BleManager.kt b/app/src/main/java/com/example/medilightv2android/ble/BleManager.kt index 473649b..64900c4 100644 --- a/app/src/main/java/com/example/medilightv2android/ble/BleManager.kt +++ b/app/src/main/java/com/example/medilightv2android/ble/BleManager.kt @@ -70,6 +70,8 @@ class BleManager private constructor(private val context: Context) { private set private var reconnectAttempt = 0 private val reconnectIntervalMs: Long = 3000 + /** max retry — 10회 시도 후 포기 (≈ 8s scan × 10 + 간격, 약 100~120초). */ + private val MAX_RECONNECT_ATTEMPTS = 10 private var reconnectTimer: Runnable? = null @Volatile private var lastRxTimestamp: Long = 0 private var watchdogTimer: Runnable? = null @@ -738,6 +740,14 @@ class BleManager private constructor(private val context: Context) { isReconnecting.value = false return } + // max 시도 가드 — 무한 루프 방지. 초과 시 사용자가 명시적으로 재시도하도록. + if (reconnectAttempt >= MAX_RECONNECT_ATTEMPTS) { + debugLogger.warn("RECONNECT_GIVE_UP after ${reconnectAttempt} attempts — manual retry required") + isReconnecting.value = false + reconnectAttempt = 0 + onReconnectionFailed?.invoke() + return + } reconnectAttempt++ reconnectConnecting = false