From 7e1685f5f959178b6e202f1d3af3610939f7b99a Mon Sep 17 00:00:00 2001 From: Richard de Boer Date: Wed, 31 May 2023 20:48:06 +0200 Subject: [PATCH] Bangle.js: fix memory leak from HTTP requests Every call to Volley.newRequestQueue() creates a new global thread pool, which isn't automatically cleaned up once the request completes. With this commit we create a RequestQueue around on first use, and reuse it for subsequent requests. --- .../banglejs/BangleJSDeviceSupport.java | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/banglejs/BangleJSDeviceSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/banglejs/BangleJSDeviceSupport.java index 7c0889a5c..4621e573b 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/banglejs/BangleJSDeviceSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/banglejs/BangleJSDeviceSupport.java @@ -160,6 +160,9 @@ public class BangleJSDeviceSupport extends AbstractBTLEDeviceSupport { // this stores the globalUartReceiver (for uart.tx intents) private BroadcastReceiver globalUartReceiver = null; + // used to make HTTP requests and handle responses + private RequestQueue requestQueue = null; + /// Maximum amount of characters to store in receiveHistory public static final int MAX_RECEIVE_HISTORY_CHARS = 100000; /// Used to avoid spamming logs with ACTION_DEVICE_CHANGED messages @@ -184,6 +187,7 @@ public class BangleJSDeviceSupport extends AbstractBTLEDeviceSupport { super.dispose(); stopGlobalUartReceiver(); stopLocationUpdate(); + stopRequestQueue(); } private void stopGlobalUartReceiver(){ @@ -199,6 +203,19 @@ public class BangleJSDeviceSupport extends AbstractBTLEDeviceSupport { gpsUpdateSetup = false; } + private void stopRequestQueue() { + if (requestQueue != null) { + requestQueue.stop(); + } + } + + private RequestQueue getRequestQueue() { + if (requestQueue == null) { + requestQueue = Volley.newRequestQueue(getContext()); + } + return requestQueue; + } + private void addReceiveHistory(String s) { receiveHistory += s; if (receiveHistory.length() > MAX_RECEIVE_HISTORY_CHARS) @@ -598,7 +615,6 @@ public class BangleJSDeviceSupport extends AbstractBTLEDeviceSupport { final String id = _id; if (BuildConfig.INTERNET_ACCESS && devicePrefs.getBoolean(PREF_DEVICE_INTERNET_ACCESS, false)) { - RequestQueue queue = Volley.newRequestQueue(getContext()); String url = json.getString("url"); int method = Request.Method.GET; @@ -691,6 +707,7 @@ public class BangleJSDeviceSupport extends AbstractBTLEDeviceSupport { return h; } }; + RequestQueue queue = getRequestQueue(); queue.add(stringRequest); } else { if (BuildConfig.INTERNET_ACCESS)