안드로이드

[안드로이드] Thread, Thread간 통신/ Handler, Looper의 개념

디벨로펄 2023. 3. 21.
반응형

참고 
1. 성빈랜드님 글

 

안드로이드 스레드에 대해 한 번에 알아보자

AndroidDeepDive #1 — thread, message, message queue, looper, handler

sungbin.land

2. https://hungseong.tistory.com/26

 

[Android, Kotlin] 멀티 스레드 간 통신을 위한 Handler, Looper

안드로이드는 기본적으로 Main Thread (or UI Thread) 하나만으로 구성되는 Single Thread Model로써 동작한다. Single Thread Model의 2가지 원칙은 다음과 같다. 1. Main Thread를 Block 하지 말 것 2. Android UI ToolKit (Text

hungseong.tistory.com

3. 해로 님의 글..

 

[Android] Looper & Handler 기초 개념

안드로이드 멀티 쓰레딩 공략하기

velog.io

감사합니다.

 스레드 Thread : 프로세스에서 실행되는 실행의 흐름 단위

안드로이드는 기본적으로 하나의 main thread만 가지고 있다.(=싱글 스레드)

동작의 무결성을 보장하기 위해 싱글 스레드 사용.

1. 메인 스레드(UI Thread)를 블로킹해서는 안됨.
→ 사용자에게 보여지는 UI 동작을 멈추면 안된다.
2. UI 관련 동작은 오로지 메인 thread에서만 접근해야함.
→ UI 동작의 무결성 보장

■ 워커 스레드 Worker Thread

JVM에서는 하나의 프로세스에서 여러 스레드를 가질 수 있도록 허용하고 있다. Main Thread외에 추가된 Thread를 Worker Thread라고 한다. 스레드가 2개 이상인 상태를 멀티 스레드라고 한다.

- Room 라이브러리, 네트워크 통신 등 오래 걸리는 작업 필수적으로 워커 스레드 사용하도록 한다.

 

■ 메인 스레드 Main Thread : 모든 UI 작업!!

안드로이드의 모든 UI 작업메인 스레드에서 하도록 강제하고 있다. 

Why!!???

※ 만약 UI 작업이 서로 다른 thread에서 동작하게 된다면 아래와 같은 문제가 발생할 수 있다.

서로 다른 Thread에서 동작하는 UI 작업은 작업 순서를 보장하지 못한다.

우리는 왼쪽과 같은 결과를 기대하지만, 실제로 스레드는 오른쪽과 같이 동작할 수도 있다.

그렇기 때문에, Main Thread가 모든 UI 작업을 담당하게 되는 것이다.

Main Thread에서 동작하는 이유, thread는 작업순서를 보장하지 못함.

 

복잡한 연산은 워커스레드에서 진행하고 Main Thread로 전달하게 된다.(Thread간 통신)

안드로이드 내에서는 Thread간 통신을 위해 Looper와 Handler라는 장치를 제공한다.

이를 활용해 멀티 스레딩 환경을 구축한다.

 

■ Looper

명령을 받기 위해서는 명령을 대기하는 루프를 돌려야한다. 이때 while(true)같은 방법이 아닌, 메세지 큐를 사용하여 효율적으로 루프를 돌리게 된다. 이 루프는 Looper라는 클래스를 통해 실행된다.

 

하나의 스레드는 오직 하나의 Looper를 가지며, 해당 Looper는 오직 하나의 스레드를 담당한다.

안드로이드 MainActicity 실행과 동시에 메인 스레드의 Looper가 실행된다.

Looper 내부에는 메세지 큐가 있으며, 해당 스레드가 처리해야할 동작이 '메세지'라는 형태로 하나씩 쌓인다.

Lopper는 궁극적으로 메세지 큐에 들어오는 메세지를 하나씩 꺼내 이를 적절한 Handler로 전달하는 역할을 한다.

 

 

Looper의 동작

* 메세지 : 사용자 상호작용을 포함한 모든 시스템 이벤트를 전달할 때 사용되는 객체.

- runnable 객체 또는 Message객체로 이뤄질 수 있다.

- runnable 객체인 경우 Looper에서 run()을 수행하여 실행

- Message 객체인 경우, Message 객체 내부에 명시돼있는 Handler의 handleMessage()를 수행하여 처리한다.

 

* 메세지 큐 : 발생되는 메세지를 순서대로 받아서 처리하기 위해 사용하는 큐

기본적으로 Looper는 어떤 Handler에 메세지를 전달해야하는 지에 대한 참조를 가지고 있다.(기본값 : Main Thread의 Handler)

 

■ 핸들러 - Handler

Looper의 메세지 큐에 특정 메세지를 넣거나, Looper로부터 메세지를 전달하면 이를 처리한다.

 

□ Looper로 메세지 전달할 때

Message 객체를 생성하여 이를 전달하는 방식으로 구현.

- sendMessage() 메소드로 메세지 큐에 Message 객체 적재 가능

- post로 시작하는 메소드들을 통해 Runnable 객체를 직접 적재 가능

 

□ Looper로부터 Message객체를 전달받았을 때

해당 메세지 내부의  Handler가 갖고 있는 handleMessage() 메소드를 호출함으로써

해당 Handler가 메세지를 전달받을 수 있음.

 

 

 

■ 그래서 어떻게 스레드간 통신을 가능하게 하는가?

다른 스레드에서 MainThread의 mainHandler.sendMessage() 또는 post메서드를 통해 message객체 또는 Runnable 객체를 전달 할 수 있다.

이 과정을 통해서 다른 thread와 Main Thread는 통신을 하게 된다.

 

 

그래서.. post는 어떻게 사용이 되는 것인가..?를 좀 더 탐구해봐야겠다.

반응형

댓글