본문 바로가기

programming/java, Spring, android, js

[Thread Network] Network 입출력 예외

이번에 작업을 해준 안드로이드 프로젝트 소스에는 재미난 코드가 있었다.
블루투스 연동이었는데, 시작부터 데이터를 읽어오고 그 값을 Integer 로 파싱하였다.
당연히 오류가 날 것이었다.

 

while(!Thread.currentThread().isInterrupted()) {
   ... 중략
   System.arraycopy(readBuffer, 0, encodedBytes, 0, encodedBytes.length);
   final String data = new String(encodedBytes, "US-ASCII"); // 블루투스 데이터 입력
   int 값 = Integer.parseInt(data);
   ... 생략
}

최초에는 메인쓰레드에 있었다.
시작부터 ANR 이 떴다.

ANR 지침
https://support.google.com/googleplay/android-developer/answer/6083203?hl=ko

 

비정상 종료 및 애플리케이션 응답 없음(ANR) 오류 데이터 보기 - Play Console 고객센터

이 도움말이 도움이 되었나요? 어떻게 하면 개선할 수 있을까요? 예아니요

support.google.com


안드로이드에서는 쓰레드 쓰면서 조심해야할 작업이 세가지가 있다.


1. 파일 입출력
2. 외부 네트워크 작업
3. 메인 UI 스레드가 아닌 스레드에서의 UI 수정작업
(사실 3번을 제외하면 윈도우 프로그램 작업할때도 엄청 유의해야할 부분이긴하다.)

우선적으로 핸들러를 구현하여 3번을 해제하고보니 2번부분이 또 걸린다.
고객이 요청한 작업은 블루투스연동인데, 스레드로 무한히 데이터를 요청한다.
반드시 값을 숫자 값을 가져온다는 보장이 없으므로 (네트워크 통신의 신뢰성이 100프로 보장되지 않는 통신)
null 체크를 추가하였다.

기 구현된 Thread 를 위해 핸들러를 구현했을뿐, 핸들러가 마음에 들지 않으면 AsyncTask를 활용하는 것도 하나의 방법이었으리라 생각한다. 고객 요구사항이 받아온 값에 따라 UI 변경이었으므로 백그라운드 연결과 함께 중간중간 update 화면만 변화를 준다면 AsyncTask 도 나쁘지 않은 선택이라 생각하기때문이다.

반응형