From 58cbb5f0762307a45e4f11c179d2576bf4f9db77 Mon Sep 17 00:00:00 2001 From: "David G. Young" Date: Wed, 10 Oct 2018 16:07:04 -0400 Subject: [PATCH 1/2] Prevent crashes caused by OutOfMemoryError when Android cannot allocate a new thread for scanning --- .../altbeacon/beacon/service/ScanHelper.java | 3 ++- .../org/altbeacon/beacon/service/ScanJob.java | 17 ++++++++++++++--- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/altbeacon/beacon/service/ScanHelper.java b/src/main/java/org/altbeacon/beacon/service/ScanHelper.java index 23e5b23b9..fb957a8ff 100644 --- a/src/main/java/org/altbeacon/beacon/service/ScanHelper.java +++ b/src/main/java/org/altbeacon/beacon/service/ScanHelper.java @@ -129,8 +129,9 @@ void processScanResult(BluetoothDevice device, int rssi, byte[] scanRecord) { new ScanHelper.ScanProcessor(nonBeaconLeScanCallback).executeOnExecutor(mExecutor, new ScanHelper.ScanData(device, rssi, scanRecord)); } catch (RejectedExecutionException e) { - LogManager.w(TAG, "Ignoring scan result because we cannot keep up."); + } catch (OutOfMemoryError e) { + LogManager.w(TAG, "Ignoring scan result because we cannot start a thread to keep up."); } } diff --git a/src/main/java/org/altbeacon/beacon/service/ScanJob.java b/src/main/java/org/altbeacon/beacon/service/ScanJob.java index 9e580d9bc..a4f90118e 100644 --- a/src/main/java/org/altbeacon/beacon/service/ScanJob.java +++ b/src/main/java/org/altbeacon/beacon/service/ScanJob.java @@ -54,7 +54,10 @@ public class ScanJob extends JobService { @Override public boolean onStartJob(final JobParameters jobParameters) { - initialzeScanHelper(); + if (!initialzeScanHelper()) { + LogManager.e(TAG, "Cannot allocate a scanner to look for beacons. System resources are low."); + return false; + } if (jobParameters.getJobId() == getImmediateScanJobId(this)) { LogManager.i(TAG, "Running immediate scan job: instance is "+this); } @@ -168,7 +171,8 @@ private void stopScanning() { LogManager.d(TAG, "Scanning stopped"); } - private void initialzeScanHelper() { + // Returns false if cycle thread cannot be allocated + private boolean initialzeScanHelper() { mScanHelper = new ScanHelper(this); mScanState = ScanState.restore(ScanJob.this); mScanState.setLastScanStartTimeMillis(System.currentTimeMillis()); @@ -177,8 +181,15 @@ private void initialzeScanHelper() { mScanHelper.setBeaconParsers(mScanState.getBeaconParsers()); mScanHelper.setExtraDataBeaconTracker(mScanState.getExtraBeaconDataTracker()); if (mScanHelper.getCycledScanner() == null) { - mScanHelper.createCycledLeScanner(mScanState.getBackgroundMode(), null); + try { + mScanHelper.createCycledLeScanner(mScanState.getBackgroundMode(), null); + } + catch (OutOfMemoryError e) { + LogManager.w(TAG, "Failed to create CycledLeScanner thread."); + return false; + } } + return true; } // Returns true of scanning actually was started, false if it did not need to be From e2aa6e019d4ebb6be107140bcbc37c1798ee89fe Mon Sep 17 00:00:00 2001 From: "David G. Young" Date: Wed, 10 Oct 2018 16:20:34 -0400 Subject: [PATCH 2/2] update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3cef476bd..90310e1c2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ ### Development +- Prevent infrequent out of memory crashes on Android 8+ (#750 Pappas Christodoulos, David G. Young) - Prevent duplicate ranging/monitoring callbacks casued by bind/unbind with a service (#748, Adrián Nieto Rodríguez, #745, David G. Young)