From b5fabd980f5b46f80033874dea1771dae10b0d9e Mon Sep 17 00:00:00 2001 From: fiatcode Date: Sat, 2 May 2026 16:25:47 +0700 Subject: [PATCH] fix: resolve Handler leak, race condition, and duplicate location send in speed calculation --- .../tracpulse/service/LocationTrackingService.kt | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/android/app/src/main/kotlin/dev/fiatcode/tracpulse/service/LocationTrackingService.kt b/android/app/src/main/kotlin/dev/fiatcode/tracpulse/service/LocationTrackingService.kt index 6c064a6..e66c453 100644 --- a/android/app/src/main/kotlin/dev/fiatcode/tracpulse/service/LocationTrackingService.kt +++ b/android/app/src/main/kotlin/dev/fiatcode/tracpulse/service/LocationTrackingService.kt @@ -57,6 +57,7 @@ class LocationTrackingService : Service() { private var isTracking = false private var isNetworkAvailable = true private var bypassFilterOnce = false + private val speedHandler = Handler(Looper.getMainLooper()) private var currentConfig: TrackingConfig? = null private var pendingSpeedLocation: Location? = null @@ -188,6 +189,7 @@ class LocationTrackingService : Service() { Log.d(TAG, "stopTracking: set tracking_active=false") fusedLocationProvider.stopLocationUpdates() heartbeatScheduler.cancelHeartbeat() + speedHandler.removeCallbacksAndMessages(null) releaseWakeLock() stopForeground(STOP_FOREGROUND_REMOVE) @@ -236,8 +238,11 @@ class LocationTrackingService : Service() { val nativeSpeed = if (location.hasSpeed()) location.speed else null if (nativeSpeed == null || nativeSpeed <= 0) { - pendingSpeedLocation = location - requestLocationForSpeedCalculation() + if (!speedRequestPending) { + pendingSpeedLocation = location + requestLocationForSpeedCalculation() + } + return } val traccarLocation = TraccarLocation( @@ -296,7 +301,7 @@ class LocationTrackingService : Service() { if (speedRequestPending) return speedRequestPending = true - Handler(Looper.getMainLooper()).postDelayed({ + speedHandler.postDelayed({ fusedLocationProvider.getLastLocation { location -> location?.let { val calculatedSpeed = distanceFilterProcessor.getCalculatedSpeed(it)