불루투스를 통해 인풋스트림을 열어 read하는 스레드입니다.
대략 아래와 같이 구성되어 있습니다
try{
Inputstream Input = 블루투스소켓에서 getInputstream();
...
while (!Thread.currentThread().isInterrupted()) {
if(Input.available() > 0){
cycle...
}else{
Thread.sleep(1000);
}
}
}catch (IOException ex){
}catch (InterruptedException e) {
}finally{
Input.close();
}
해당 쓰레드의 인터럽트는 제가 블루투스 통신을 끊을때 다음과 같이 호출합니다.
if (쓰레드변수 != null) {
if (쓰레드변수.isAlive()) {
쓰레드변수.interrupt();
쓰레드변수 = null;
}
}
블루투스 소켓 close();
블루투스 통신을 다시 붙일때도 위와 같은 if문으로 확인하고요.
이상 없을거라고 생각했는데, 앱을 돌리다보면 간혹 페이탈이 뜨더라구요.
로그캣과 제가찍은 로그 분석해보니
블루투스 연결이 해제되었는데
스레드가 제때 종료되지 않고
인풋스트림을 참조한것 같습니다.
제가 이해가 안가는건,
1. while문 인터럽트 검사
-> 2. if문에서 인풋스트림 available 메소드를 호출
-> 3. 인풋스트림 read 메소드를 호출
-> 4. 이 후 데이터 처리 사이클(인풋스트림 참조 없음)
위와 같은 방식에서
블루투스 통신을 해제하는 순서는 저 위에 있는것처럼 인터럽트 후에 소켓을 닫습니다.
그런데 1에서 인터럽트 조건은 통과하고,
2와 3에서 인풋스트림이 참조될 수 없는게(블루투스 소켓이 close) 일어난건가요?
이런 경우 어떤 방향으로 해결을 해야할지도 조언 부탁드립니다.