2021.01.16
Windowsで開発機のクローンを作るには EaseUS Todo PCTrans
2019.06.26
プログラミングAndroid BluetoothLeScanner でくそ重くなる
坂東です。
AndroidでBLEの信号を取得したければ BluetoothLeScanner を使います。
すると一定間隔で ScanCallback.onScanResult に値が入ってくるというわけです。
機器や端末によってはonScanResultの呼ばれる頻度が半端ありません。
50ms間隔とか。
そうするとものすごく重いです。
とくに何もしない以下のようなサンプルコードでも、徐々に端末が重くなりフリーズします。
1 2 3 4 5 6 7 |
scanCallback = new ScanCallback() { @Override public void onScanResult(int callbackType, final ScanResult result) { super.onScanResult(callbackType, result); BluetoothDevice bluetoothDevice = result.getDevice(); }) } |
対策としてはonScanResultの内部処理を別スレッドで動かすことです。
1 2 3 4 5 6 7 8 9 10 11 12 |
scanCallback = new ScanCallback() { @Override public void onScanResult(int callbackType, final ScanResult result) { super.onScanResult(callbackType, result); new Thread(new Runnable() { @Override public void run() { BluetoothDevice bluetoothDevice = result.getDevice(); } }).start(); }) } |
なにも考えないとUIスレッドで処理するわけですが、UIはシングルスレッドなので処理が滞留して徐々に重くなっていくという訳のようですね。
おわり。
【テクノモバイルではエンジニア/デザイナーを積極採用中です!】
下記項目に1つでも当てはまる方は是非、詳細ページへ!Qangaroo(カンガルー)
最近の記事
タグ検索
SNS共有