728x90
블루투스 서비스를 개발하면서 어플이 꺼졌을 때에도 블루투스가 동작함에 있어
포그라운드를 이용해서 구현을 하였습니다
이러한 포그라운드를 이용하는데 연속된 데이터를 전송할 때
기존 Activity에서는 Handler를 이용해서 지연을 발생시켰습니다
new Handler(){
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
}
}.sendEmptyMessageDelayed(0,1000);
위에 핸들러 지연 코드를 이용하면 두개의 메시지를 시간차를 두고 보낼 수 있습니다
mBluetoothLeService.writeCharacteristic(mBluetoothLeService.GetNoti(), start_data);
new Handler(){
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
mBluetoothLeService.writeCharacteristic(mBluetoothLeService.GetNoti(), start_data);
}
}.sendEmptyMessageDelayed(0,1000);
하지만 포그라운드에서는 첫 번째 메시지만 전송되고
두 번째 핸들러를 통한 메시지는 전송되지 않았는데 이유는
포그라운드 내에서 핸들러 루프가 멈춘다는 점이었습니다
즉 OS의 전원 관리 시스템 등으로 인해서 루프를 돌리는 프로그램은
자동적으로 소멸하거나 정지된다는 내용을 찾았습니다
하지만 위 내용은 100% 맞는 말은 아닌 것이 onStartCommand 함수 내에서는
해당 핸들러 딜레이 방식이 잘 동작합니다
정확한 원인은 블루투스 서비스와의 연동 부분이 문제 되는 것으로
해당 핸들러 딜레이를 BluetoothGattCallback 내에 구현했을 때 정지되는 문제가 발생했습니다
mBluetoothLeService.writeCharacteristic(mBluetoothLeService.GetNoti(), wakeup_data);
try {
Thread.sleep(100);
mBluetoothLeService.writeCharacteristic(mBluetoothLeService.GetNoti(), start_data);
} catch (InterruptedException e) {
e.printStackTrace();
}
핸들러로는 작업이 중지되지만 Thread.sleep을 사용하면 두 개의 메시지가 잘 전송됩니다
만약 포그라운드에서 핸들러를 이용한 지연이 되지 않는다면 Thread.sleep을 사용하시면 됩니다
왜 BluetoothGattCallback내에서 루프 프로그램이 돌지 않는지에 대해서는
추후에 이유를 더 알아보고 분석하여 다시 포스팅하도록 하겠습니다
728x90
반응형
'안드로이드' 카테고리의 다른 글
[Android] java.lang.RuntimeException 에러 해결 (6) | 2022.06.28 |
---|---|
This version of the Android Support plugin for IntelliJ IDEA 에러 해결 (2) | 2022.05.27 |
Execution failed for task ':app:mergeDebugNativeLibs' 에러 해결 (5) | 2022.04.19 |
콤보 박스 Spinner 사용 (7) | 2022.04.12 |
Execution failed for task ':processDebugResources' 에러 해결 (8) | 2022.04.08 |
댓글