2024.11.14
いまさらNode.jsを知ろう~環境構築も~
2019.06.26
プログラミングAndroid BluetoothLeScanner でくそ重くなる
坂東です。
AndroidでBLEの信号を取得したければ BluetoothLeScanner を使います。
すると一定間隔で ScanCallback.onScanResult に値が入ってくるというわけです。
機器や端末によってはonScanResultの呼ばれる頻度が半端ありません。
50ms間隔とか。
そうするとものすごく重いです。
とくに何もしない以下のようなサンプルコードでも、徐々に端末が重くなりフリーズします。
scanCallback = new ScanCallback() { @Override public void onScanResult(int callbackType, final ScanResult result) { super.onScanResult(callbackType, result); BluetoothDevice bluetoothDevice = result.getDevice(); }) }
対策としてはonScanResultの内部処理を別スレッドで動かすことです。
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(カンガルー)
【テクノデジタルのインフラサービス】
当社では、多数のサービスの開発実績を活かし、
アプリケーションのパフォーマンスを最大限に引き出すインフラ設計・構築を行います。
AWSなどへのクラウド移行、既存インフラの監視・運用保守も承りますので、ぜひご相談ください。
詳細は下記ページをご覧ください。
最近の記事
タグ検索