안드로이드의 스레드는 두 가지가 존재합니다.
먼저, 일반적인 코드처리, 화면을 갱신하는 처리 등을 담당하는 메인스레드(UI 스레드)
스레드 클래스를 사용해서 백그라운드에서 작업을 처리하는 스레드를 작업 스레드(백그라운드 스레드)라고 합니다.
간단하게 정리를 하면 다음과 같습니다.
메인스레드 : UI 갱신, 눈에 보이는 처리
작업스레드 : 오래걸리는 작업, 눈에 보이지 않는 처리
그런데 데이터를 다운로드하면서 화면에 얼마큼 진행되었는지 진행도를 표시하기 위해서는 어떻게 해야 할까요?
작업 스레드는 UI를 수정할 수 없는 제약이 있어 UI를 변경하려면 메인 스레드를 사용해야 하는데, 이 두가지의 스레드를 연결하기 위해 Handler 클래스가 필요합니다.
이러한 핸들러에 대해서 조금 자세히 알아보겠습니다.
1. Handler란?
결국 핸들러란, 작업 스레드에서 메인 스레드로 메세지를 전달해 주는 역할을 하는 클래스를 말한다.
핸들러는 핸들러 객체를 만든 스레드와 해당 스레드의 message queue에 바인딩된다. Message queue는 핸들러가 전달하는 message를 보관하는 FIFO 방식의 큐이다.
다른 스레드에게 메세지를 전달하려면 메시지를 전달하려는 스레드에서 생성한 핸들러의 post()와 sendMessage() 등의 함수를 이용해야 한다. 그래야 수신대상 message queue에 메시지가 저장되기 때문이다.
message queue 에 저장된 message 나 runnable 은 Looper 가 들어온 순서대로 꺼내서 핸들러에게 전달해 준다. 그러면 핸들러는 handlerMessage() 메서드를 이용하여 Looper 에게서 받은 message 나 runnable 을 처리하게 되는 것이다.
2. Handler 구성요소
- 메시지(Message)
스레드 통신에서 핸들러를 사용하여 데이터를 보내기 위해서는, 데이터 종류를 식별할 수 있는 식별자와 실질적인 데이터를 저장한 객체, 그리고 추가 정보를 전달할 객체가 필요합니다. 즉, 전달할 데이터를 한 곳에 저장하는 역할을 하는 클래스
- 메시지 큐(MessageQueue)
메시지 큐는 이름 그대로 Message 객체를 큐 형태로 관리하는 자료 구조를 말합니다. FIFO 방식으로 동작하기 때문에 들어온 순서에 따라 차례대로 저장됩니다.
- 루퍼(Looper)
MessageQueue는 큐에 쌓인 메시지 처리를 위해, 메시지 큐로부터 메시지를 꺼내온다음, 해당 메시지와 연결된 핸들러를 호출하는 역할을 담당합니다.
- 핸들러(Handler)
스레드의 루퍼와 연결된 메시지 큐로 메시지를 보내고 처리할 수 있게 만들어줍니다. 메인 스레드의 메시지 처리 흐름에서, 메시지 전달과 처리를 위해 개발자가 접근할 수 있는 창구 역할을 해줍니다.
3. Handler는 어떻게 사용하는가?
- 메시지를 전달 받아야 하는 스레드에서 핸들러 객체를 생성한다. (주로 메인스레드)
- 핸들러에서 수신한 메시지를 처리하기 위해 핸들러 객체 안에 handlerMessage() 메서드를 오버라이딩 한다.
- 메시지를 보낼 스레드를 만든다. (주로 작업스레드)
- 메시지를 보낼 스레드 안에서 수신 대상 스레드의 핸들러 객체를 참조하고, obtainMessage() 메서드를 이용해 참조한 핸들러의 메시지 객체를 획득한다.
- obtainMessage()로 획득한 메시지 객체에 보내고자 하는 데이터를 채우고, sendMesage() 메서드로 메시지 객체를 수신대상 스레드에 전달한다.
핸들러 이전에 스레드에 대한 글을 적어봤었는데요.
같이 보면 더 좋을 것 같아서 관련글 참조 해놓겠습니다.
2024.05.08 - [개발지식] - [개발지식] 스레드(Thread), 싱글 스레드(Single Thread), 멀티 스레드(Multi Thread)
[개발지식] 스레드(Thread), 싱글 스레드(Single Thread), 멀티 스레드(Multi Thread)
코드와 함께 싱글스레드와 멀티스레드에 대해서 포스팅해보겠습니다. 1. 스레드란?하나의 프로세스 내부에서 독립적으로 실행되는 하나의 작업 단위라고 할 수 있다.싱글 스레드말 그대로 싱
goharry.tistory.com
끝!
'안드로이드' 카테고리의 다른 글
[Android] Glide 2 - 로딩 애니메이션 구현 (0) | 2024.07.27 |
---|---|
[Android] Handler 예제 (2) | 2024.07.13 |
[Android] MVC 패턴 예제! (0) | 2024.05.04 |
[Android] 디자인 패턴 이해 (MVC/MVP/MVVM) (0) | 2024.04.30 |
[Android] SharedPreferences, 간단한 정보 저장/불러오기 (0) | 2024.04.30 |