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