From 02b731738c7d78c7cbccf7d24af8a20006691925 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Rebelo?= Date: Wed, 20 Aug 2025 16:39:01 +0100 Subject: [PATCH] Maps: Avoid OOM with large maps Adding the tile renderer layer before setting the track boundaries would load the entire maps to memory, which would cause OOM issues for some large maps. --- .../gadgetbridge/util/maps/MapsManager.java | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/maps/MapsManager.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/maps/MapsManager.java index 96ff28a2e5..166b2f6398 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/maps/MapsManager.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/maps/MapsManager.java @@ -63,6 +63,7 @@ public final class MapsManager { private Polyline polyline; private TileRendererLayer tileRendererLayer; + private boolean tileRenderedAdded; private boolean isMapLoaded = false; @@ -153,8 +154,8 @@ public final class MapsManager { theme = MapTheme.DEFAULT; } tileRendererLayer.setXmlRenderTheme(theme); - - mapView.getLayerManager().getLayers().add(0, tileRendererLayer); + // Do not add the tile renderer layer before setting the bounding box in setTrack, + // otherwise we load the entire map to memory and might crash with OOM } public boolean isMapLoaded() { @@ -169,7 +170,9 @@ public final class MapsManager { } if (tileRendererLayer != null) { - mapView.getLayerManager().getLayers().remove(tileRendererLayer); + if (tileRenderedAdded) { + mapView.getLayerManager().getLayers().remove(tileRendererLayer); + } tileRendererLayer.onDestroy(); tileRendererLayer.getTileCache().purge(); tileRendererLayer = null; @@ -205,7 +208,6 @@ public final class MapsManager { mapView.addLayer(polyline); } polyline.setPoints(points); - mapView.getLayerManager().redrawLayers(); mapView.setCenter(new LatLong(minLat + (maxLat - minLat) / 2, minLon + (maxLon - minLon) / 2)); final DisplayMetrics displayMetrics = mContext.getResources().getDisplayMetrics(); @@ -215,6 +217,11 @@ public final class MapsManager { mapView.getModel().displayModel.getTileSize() ); mapView.setZoomLevel(zoom); + + if (!tileRenderedAdded) { + mapView.getLayerManager().getLayers().add(0, tileRendererLayer); + tileRenderedAdded = true; + } } public void reload() {