Я использую нить и обработчик для получения службы сканирования Bluetooth определенного периода и частоты сканирования (сканирование 1 с, сон 1 с, сканирование 1 с и т. Д. c) с помощью BluetoothLeScanner (фактически мигрирующего из BluetoothAdapter). Однако со временем я понимаю, что это пожирает память.
Затем я попытался использовать профилировщик, чтобы увидеть, что произошло, и обнаружил, что что-то зацикливается рекурсивно. Я проверил свой код и не смог найти проблему. Кто-нибудь может помочь / столкнулся с той же проблемой?
public class BleDetectionService extends Service {
private static Handler handler;
private static final long SCAN_PERIOD = 1100;
...
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
....
startBLEScanning();
return super.onStartCommand(intent, flags, startId);
}
private void startBLEScanning() {
mLeDeviceAdapter = new LeDeviceAdapter();
mScanning = true;
Toast.makeText(this, "BLE Service sucessfully started", Toast.LENGTH_SHORT).show();
bleScanningThread = new Thread(new Runnable() {
@Override
public void run() {
Looper.prepare();
while (mScanning) {
scanLeDevice(true);
}
}
}, "BLE Scanning Thread");
bleScanningThread.start();
}
private void scanLeDevice(final boolean enable) {
if (enable) {
handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
bluetoothLeScanner.stopScan(scanCallback);
}
}, SCAN_PERIOD);
// filter
ScanFilter.Builder builder = new ScanFilter.Builder();
ScanFilter filter = builder.build();
ArrayList<ScanFilter> filters = new ArrayList<>();
filters.add(filter);
// scansetting
ScanSettings.Builder settingsBuilder = new ScanSettings.Builder();
settingsBuilder.setScanMode(ScanSettings.SCAN_MODE_BALANCED);
settingsBuilder.setReportDelay(0);
ScanSettings settings = settingsBuilder.build();
bluetoothLeScanner.startScan(filters, settings, scanCallback);
} else {
bluetoothLeScanner.stopScan(scanCallback);
}
}
}
записано в более раннее время
записано позднее
РЕДАКТИРОВАТЬ: Я удалил нить и обработчик, как я перепутал использование BluetoothLeScanner с BluetoothAdapter. ScanLeDevice () теперь вызывается из основного потока, как предложено @ greeble31