마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

포그라운드 서비스를 이용해 소켓 통신을 하고, 그 결과값으로 엑티비티 UI 변경하는 방법

0 추천
포그라운드 서비스에서 소켓 통신을 유지하고 있습니다.

순서는  메인 엑티비티 -> 서비스 -> 엑티비티 이고, 각 역할은 아래와 같습니다.

메인 엑티비티 - 서비스 호출

서비스 - 소켓 연결, 값 수신, 엑티비티로 값 전달

엑티비티 - 수신한 값으로 UI 변경

 메인 엑티비티의 onCreate에서 포그라운드 서비스가 실행되고, 서비스 속에 소켓 통신을 하는 스레드를 무한루프로 돌렸습니다.  여기서 소켓을 연결하고, 소켓에서 얻어온 값을 static으로 엑티비티에 전송하고 엑티비티에 들어가면 받은 값을 엑티비티 텍스트 뷰에 보여주고 값이 변경되도 static으로 받아오니까 바로 확인할 수 있고, 엑티비티에서 버튼을 누르면 버튼 누른 값(임의의 변수 값에 true, false값을 저장했습니다. 이 값)을 다시 소켓으로 static 변수에 값을 담아 전송하는 식으로 구성하였습니다.

원하는건 백그라운드에서 소켓 통신이 유지되며, 값이 계속 들어올건데 전달 받은 값을 3개의 엑티비티의 UI를 업데이트 해주고 값이 변경된다면 변경된 값이 바로 보이게 하고 싶어요

 

static을 사용하지않는 것이 좋다고 하셔서 Looper를 사용해봤는데 원하는게 아닌거 같아요,, static을 사용하하지않고 사용할만한 다른 방법이 있을까요?  

 

시도한 방법은 소켓 스레드 돌리는 무한루프 안에서 받아온 값으로 엑티비티에 있는 핸들러에 sendEmptyMessage를 보내는 방법을 시도했는데 null 포인트 에러가 발생해서 static을 이용했어요,,

Looper는 소켓 통신 스레드에서 값을 보내고 엑티비티에서 값을 전달받게 했는데 이것도 static을 이용하게 되더라구요 ㅠ
랄라룽 (380 포인트) 님이 2021년 7월 26일 질문

1개의 답변

0 추천
콜백을 사용하세요. 모바일에서 static 은 문제가 생길 우려가 있고 일단 생기고 나면 해결하기가 여간 까다롭지 않습니다. Handler를 사용했을 때 NullPointerException 이 자주 발생하는 것은 님이 Handler를 사용할 때 라이프사이클 같은 부분이 고려되지 않아서 그럴겁니다.  Handler를 사용하지 않으실 거면, RxJava(Java)나 Coroutine(Kotlin)을 이용해서 백그라운드 작업을 많이 처리합니다. 백그라운드 스레드를 메인스레드로 전환하는게 쉽습니다.
spark (226,420 포인트) 님이 2021년 7월 26일 답변
알려주셔서 감사합니다.
라이프사이클 때문이군요 이제 공부하기 시작한거라 엉망진창이네요 ㅠㅠ 하나씩 차근차근 해볼게요!
감사합니다.
...