Android

[Android] Handler

an-hayyy 2021. 9. 2. 16:00

긴 시간이 걸리는 작업을 메인스레드에서 작업한다면 애플리케이션의 성능이 저하됨은 물론이고, 지나치게 많은 시간이 걸리는 경우 ANR(Application Not Responding)상태로 전환이 될 수 있음. 따라서 시간이 걸리는 작업을 수행해야 할 때에는 여분의 스레드를 활용하여 메인스레드와 분리해서 작업해야하고 자연스럽게 메인스레드와 다른 스레드가 통신하는 방법이 필요함.

 

메인스레드

안드로이드 주요 컴퍼넌트를 실행하는 곳이자 UI를 그리거나 갱신하는 일을 담당할 수 있는 유일한 스레드(UI스레드)

 

Handler

handler는 스레드의 Message Queue와 연계하여 Message나 Runnable객체를 받거나 처리하여 스레드 간의 통신을 할 수 있도록 함.

Handler는 혼자서는 아무 동작을 할 수 없기 때문에 Thread, Looper, Message Queue가 없다면 아무것도 할 수가 없음.

 

Handler 주요 함수

- Handler.sendMessage(Message msg) : Message 객체를 message queue에 전달하는 함수

- Handler.setdEmptmessage(int what) : Message의 what 필드를 전달하는 함수

- Haneler.post(new Runnable()) : Runnable 객체를 message queue에 전달하는 함수

 

Looper의 역할

Looper는 하나의 스레드만 담당 가능(스레드도 하나의 Looper만 가질 수 있음)

Looper는 MessageQueue가 비어있는 동안은 아무 행동도 안하고 메시지가 들어오면 해당 메시지를 꺼내 적절한 Handler로 전달.

 

Looper와 Hander의 작동 원리

 

멀티 스레드 환경에서 Main Thread와 Worker Thread 간 즉, 서로 다른 스레드 간에 통신을 도와주는 도구가 바로 Handler와 Looper.

메인 스레드는 내부적으로 Looper를 가지며 그 안에는 Message Queue가 포함. Message Queue는 스레드가 다른 스레드나 혹은 자신으로부터 전달받은 Message를 보관하는 Queue(선입선출). Looper는 Message Queue에서 Message나 Runnable 객체를 차례로 꺼내 Handler가 처리하도록 전달. Handler는 Looper로부터 받은 Message를 실행이나 처리하거나 다른 스레드로부터 메시지를 받아서 Message Queue에 넣는 역할을 하는 스레드 간의 통신 장치.

 

Looper와 Message Queue

Looper는 무한히 루프를 돌며 자신이 속한 스레드의 Mesage Queue에 들어온 Messag 나 Runnable 객체를 차례로 꺼내서 이를 처리할 Handler에 전달하는 역할. 기본 스레드에서 메시지를 전달받으려면 preare() 메서드를 통해 Looper를 생성하고 무한히 루프를 돌며 Meseeage Queue에 쌓인 Message나 Runnable 객체를 꺼내 Handler에 전달하도록 함. 

 

Message와 Runnable

Message란 스레드 간 통신할 내용을 담는 걕체이자 Queue에 들어갈 일감의 단위로 Haneler를 통해 보낼수 있음.

 

 

TIP. UI 작업은 메인 스레드에서!

 

참고 : https://seosh817.tistory.com/12

https://brunch.co.kr/@mystoryg/84

https://academy.realm.io/kr/posts/android-thread-looper-handler/

https://itmining.tistory.com/5

'Android' 카테고리의 다른 글

[패스트캠퍼스] Kotlin vs JAVA  (0) 2023.01.03
[패스트캠퍼스] 코틀린 문법 훑어보기  (0) 2023.01.02
[Android] CallBack  (0) 2021.06.08
[Android] 라이브러리 만들기  (0) 2021.06.07
[JAVA] 싱글톤(Singleton) 패턴  (0) 2021.04.11