Skip to content

Commit e505ff9

Browse files
committed
Add some documentation for cycled scanner handlers
This helps to try explaining how / when the various internal handlers should be used. This is important to help developers understand various threading flow orders, race conditions, and resource contention problems. As part of the documentation this adds `MainThread` and `WorkerThread` annotations to the deferred `Runnable` tasks' `run` methods. See Also: - https://developer.android.com/studio/write/annotations.html#thread-annotations
1 parent 52435b1 commit e505ff9

3 files changed

Lines changed: 36 additions & 0 deletions

File tree

src/main/java/org/altbeacon/beacon/service/scanner/CycledLeScanner.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
import android.os.HandlerThread;
1616
import android.os.Looper;
1717
import android.os.SystemClock;
18+
import android.support.annotation.MainThread;
19+
import android.support.annotation.NonNull;
1820

1921
import org.altbeacon.beacon.BeaconManager;
2022
import org.altbeacon.beacon.logging.LogManager;
@@ -41,8 +43,30 @@ public abstract class CycledLeScanner {
4143

4244
protected long mBetweenScanPeriod;
4345

46+
/**
47+
* Main thread handle for scheduling scan cycle tasks.
48+
* <p>
49+
* Use this to schedule deferred tasks such as the following:
50+
* <ul>
51+
* <li>{@link #scheduleScanCycleStop()}</li>
52+
* <li>{@link #scanLeDevice(Boolean) scanLeDevice(true)} from {@link #deferScanIfNeeded()}</li>
53+
* </ul>
54+
*/
55+
@NonNull
4456
protected final Handler mHandler = new Handler(Looper.getMainLooper());
57+
58+
/**
59+
* Handler to background thread for interacting with the low-level Android BLE scanner.
60+
* <p>
61+
* Use this to queue any potentially long running BLE scanner actions such as starts and stops.
62+
*/
63+
@NonNull
4564
protected final Handler mScanHandler;
65+
66+
/**
67+
* Worker thread hosting the internal scanner message queue.
68+
*/
69+
@NonNull
4670
private final HandlerThread mScanThread;
4771

4872
protected final BluetoothCrashResolver mBluetoothCrashResolver;
@@ -177,6 +201,7 @@ public void destroy() {
177201
// So we stop the thread using the handler, so we make sure it happens after all other
178202
// waiting Runnables are finished.
179203
mHandler.post(new Runnable() {
204+
@MainThread
180205
@Override
181206
public void run() {
182207
LogManager.d(TAG, "Quitting scan thread");
@@ -270,6 +295,7 @@ protected void scheduleScanCycleStop() {
270295
setWakeUpAlarm();
271296
}
272297
mHandler.postDelayed(new Runnable() {
298+
@MainThread
273299
@Override
274300
public void run() {
275301
scheduleScanCycleStop();

src/main/java/org/altbeacon/beacon/service/scanner/CycledLeScannerForJellyBeanMr2.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
import android.bluetooth.BluetoothDevice;
66
import android.content.Context;
77
import android.os.SystemClock;
8+
import android.support.annotation.MainThread;
9+
import android.support.annotation.WorkerThread;
810

911
import org.altbeacon.beacon.logging.LogManager;
1012
import org.altbeacon.bluetooth.BluetoothCrashResolver;
@@ -36,6 +38,7 @@ protected boolean deferScanIfNeeded() {
3638
setWakeUpAlarm();
3739
}
3840
mHandler.postDelayed(new Runnable() {
41+
@MainThread
3942
@Override
4043
public void run() {
4144
scanLeDevice(true);
@@ -65,6 +68,7 @@ private void postStartLeScan() {
6568
final BluetoothAdapter.LeScanCallback leScanCallback = getLeScanCallback();
6669
mScanHandler.removeCallbacksAndMessages(null);
6770
mScanHandler.post(new Runnable() {
71+
@WorkerThread
6872
@Override
6973
public void run() {
7074
try {
@@ -85,6 +89,7 @@ private void postStopLeScan() {
8589
final BluetoothAdapter.LeScanCallback leScanCallback = getLeScanCallback();
8690
mScanHandler.removeCallbacksAndMessages(null);
8791
mScanHandler.post(new Runnable() {
92+
@WorkerThread
8893
@Override
8994
public void run() {
9095
try {

src/main/java/org/altbeacon/beacon/service/scanner/CycledLeScannerForLollipop.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
import android.content.Context;
1111
import android.os.ParcelUuid;
1212
import android.os.SystemClock;
13+
import android.support.annotation.MainThread;
14+
import android.support.annotation.WorkerThread;
1315

1416
import org.altbeacon.beacon.BeaconManager;
1517
import org.altbeacon.beacon.logging.LogManager;
@@ -134,6 +136,7 @@ protected boolean deferScanIfNeeded() {
134136
setWakeUpAlarm();
135137
}
136138
mHandler.postDelayed(new Runnable() {
139+
@MainThread
137140
@Override
138141
public void run() {
139142
scanLeDevice(true);
@@ -190,6 +193,7 @@ private void postStartLeScan(final List<ScanFilter> filters, final ScanSettings
190193
final ScanCallback scanCallback = getNewLeScanCallback();
191194
mScanHandler.removeCallbacksAndMessages(null);
192195
mScanHandler.post(new Runnable() {
196+
@WorkerThread
193197
@Override
194198
public void run() {
195199
try {
@@ -220,6 +224,7 @@ private void postStopLeScan() {
220224
final ScanCallback scanCallback = getNewLeScanCallback();
221225
mScanHandler.removeCallbacksAndMessages(null);
222226
mScanHandler.post(new Runnable() {
227+
@WorkerThread
223228
@Override
224229
public void run() {
225230
try {

0 commit comments

Comments
 (0)