본문 바로가기
안드로이드

[Android] 5. 네트워킹 - 스레드 이해하기(1)

qbang 2019. 7. 24.

안녕하세요 이번 시간에는 5강 네트워킹의 첫번째 강의인 '스레드 이해하기' 리뷰입니다.

스레드와 핸들러 개념을 알아보면서 실습한 내용을 덧붙여 알아보도록 하겠습니다!

 


스레드는 동시 작업을 위한 한 단위이고, 앱을 실행하면 기본 실행을 담당하는 메인 스레드가 실행됩니다.

뿐만 아니라 사용자가 원할 때마다 새로운 스레드가 만들어질 수 있는데, 새로 만든 스레드는 메인 스레드와는 별개로 실행될 수 있고 독립적인 실행이 가능하기 때문에 자주 사용됩니다.

 

표준 자바의 스레드 사용법

위 코드에 대한 결과 화면은 아래와 같습니다.

 

초기화면

[스레드 시작] 버튼을 누르면 특정 변수에 들어간 값을 증가를 시킨 상태에서 TextView에다가 값을 표시하게 하려 합니다. [스레드 확인] 버튼을 눌렀을 때에는 스레드에서 만들어낸 값 중에 지금 현재 값을 표시해줍니다.

결과화면

[스레드 시작]을 여러 번 클릭하고 진행값 확인을 누르면 현재 값: N으로 값이 바뀐 것을 확인할 수 있습니다!

 

이런 스레드의 동작 방식은 표준 자바에서의 스레드 동작 방식과 매우 유사하지만 안드로이드에서는 메인 스레드에서 관리하는 UI 구성요소를 접근할 때 핸들러가 반드시 사용되어야 한다는 점에서 차이가 있습니다.

그 이유는 UI나 파일과 같은 리소스는 여러 개의 스레드가 동시에 접근했을 때 시스템에서 어떤 것을 먼저 처리해야 하는지 모르는 데드락 상태에 빠질 수도 있기 때문입니다.

핸들러는 각 스레드 안에 만들어질 수도 있고 다른 스레드에서 요청하는 정보를 순선대로 실행시켜 줄 수 있기 때문에 리소스에 대한 동시 접근의 문제를 해결해 줍니다.

핸들러 동작 방식

스레드에서 핸들러로 메시지를 보내려면 Message 객체를 사용합니다. Message 객체를 obtainMessage 메소드로 참조한 후 sendMessage 메시지를 이용해 핸들러로 보내면 handleMessage 메소드가 자동으로 호출되기 때문에 전달된 Message 객체를 처리할 수 있습니다.

 

UI를 접근하면서 핸들러를 썼을 때의 코드를 볼까요?

위 코드에 대한 결과 화면은 아래와 같습니다.

결과 화면

스레드가 만들어지고 스레드에서 직접 텍스트 뷰를 접근할 수 없으니까 메인 스레드 핸들러에게 요청을 합니다. 그 후  send라고 하는 걸로 보내고 핸들러 안에서 핸들이 자동으로 호출되면 그때 텍스트 뷰를 접근하는 데 문제가 없으니까 해당 화면이 나타나게 되는 것입니다.

이때 이 과정이 세 단계를 거치면서 복잡하게 느껴질 수 있기 때문에 더 간단한 방법이 있습니다. 바로 Post 메소드 호출! 핸들러의 post 메소드를 호출하면 Runnable 객체를 전달할 수 있습니다. 핸들러로 전달된 Runnable, 객체는 메인 스레드에서 실행될 수 있으며 따라서 UI를 접근하는 코드는 Runnable 객체 안에 넣어두면 됩니다.

 

핸들러 일반 객체를 쓰는 방법

위 코드에 대한 결과 화면은 아래와 같습니다.

결과 화면

매번 새로운 핸들러를 정의를 하고 각각의 케이스별로 접근하는 방법을 전달해줘야 한다면 복잡해질 수 밖에 없어서 핸들러라고 하는 일반 객체를 쓰는 방법을 사용해서 코딩을 해봤습니다. 총 세가지의 방법을 사용했지만 결과 화면은 모두 동일하네요. 상황에 맞는 방법을 찾아 이용하시면 될 것 같습니다. 


소스코드를 직관적으로 보여드리기 위해서 일부러 캡처를 사용했습니다. 복사붙여넣기를 하니 색이 안들어간 일반 텍스트로 복사가 되네요.. 해결방법이 있으면 알려주시면 감사하겠습니다! 긴 글 읽느라 수고 많으셨어요 :)

댓글