Android/Android

[Android] Handler/Looper 기초

__JeongYeon 2022. 9. 28. 17:02
반응형

[모든 포스팅은 개인적 공부를 위해 작성된 글입니다]

<안드로이드의 UI 처리>

- 싱글 쓰레드 모델로 동작(메인 쓰레드 이외의 쓰레드에서 UI 업데이트 금지)

 

<메인 쓰레드에서만 UI 변경이 가능하게 한 이유?>

- UI 동작 무결성 보장 위함(여러 쓰레드에서 하나의 View에 동시에 접근한다면(변경한다면) 어떤 결과 나올지 모름)

 - 사용자에게 쾌적한 UI 환경을 제공하기 위해 다른 쓰레드가 메인 쓰레드를 블로킹 해서는 안됨

 

<(ex)메인 쓰레드가 아닌 다른 쓰레드에서 서버로부터 데이터 받아와 그 결과를 사용자에게 보여주려면?>

- 서버로부터 데이터 받아온 동작을 수행한 쓰레드로부터 메인 쓰레드로 결과를 전송해야 함(쓰레드간 통신)

 - 안드로이드에서는 쓰레드간 통신 위해 Handler, Looper 제공

 - Handler와 Looper로 멀티 쓰레딩 환경 구축 가능

 

<Looper>

- 무한루프 돌면서 Handler가 전달 받은 메세지를 Message Queue에 순차적으로 넣어줌

 - 동시에, Message Queue에서 순차적으로 Message 꺼내 Handler로 넘겨주어 Handler가 해당 작업 수행하도록 함

- 하나의 쓰레드는 오직 하나의 Looper 가짐

- 하나의 Looper는 오직 하나의 쓰레드 담당

- 메인 쓰레드의 Looper

 - MainActivity 실행과 동시에 자동으로 돌기 시작

 

<Message Queue>

- Looper 내부에 존재

- Looper를 가지는 쓰레드가 처리해야 할 동작들을 메세지의 형태로 가짐(FIFO)

 - 메세지를 하나씩 꺼내 적절한 Handler로 전달(기본적으로 Looper는 자신이 어떤 Handelr로 메세지 전달해야 하는지에 대한 정보 가지고 있음(기본값 == 메인 쓰레드의 Handler)

 - 메인 쓰레드 Looper : 대체로 UI 작업 위한 메세지 처리

 

<Message>

- 하나의 작업 단위

- Message 내용물의 종류 : Runnable 객체, Message 객체

- Looper 객체가 Message Queue에서 꺼낸 메세지에 Runnable 객체가 담겨있는 경우 Handler에 메세지 전달하지 않고 run() 수행하여 해당 Runnable() 작업 바로 시작

- 꺼낸 메세지에 Runnable 객체 없는 경우 메세지 객체 내부에 명시되어 있는 Handler의 handleMessage() 수행

 

<Handler>

- 중간 다리 역할 수행(특정 메세지를 Looper의 Message Queue에 넣거나 Looper가 Message Queue에서 특정 메세지를 꺼내 전달하면 이를 처리하는 기능 수행)

- 동작의 종류

 - 1. 메세지 객체 생성하여 Looper의 Message Queue에 넣음

  - Handler가 Looper로 메시지 전달하는 방법 : sendMessage() 사용해 Message Queue에 메세지 객체 적재하거나 post로 시작하는 메서드들을 통해 Runnable 객체를 직접 적재 

 - 2. Looper가 Message Queue에서 메시지 꺼내 전달하면 이를 처리

  - Handler가 Looper로 부터 메시지 전달 받는 경우 :  메세지에 Runnable 객체 있는 경우 해당 Runnable의 run() 호출하여 작업 수행, 메세지 객체 담겨있는 경우 해당 메세지 내부의 Handler가 갖고 있는 handleMessage() 호출하여 메시지 바음 

 

*기존에 작성한 Thread와 Handler에 관한 포스팅도 있지만 새로 정리하였습니다*

https://jeong-yeon.tistory.com/12

 

[Android/Java] 스레드(Thread)와 핸들러(Handler)

[모든 포스팅은 개인적 공부를 위해 작성된 글입니다] <스레드(Thread)란?> - 동시 수행이 가능한 작업 단위 - 현재 수행 중인 작업 외의 기능을 동시에 처리할 때 사용  - ex) 네트워킹 수행 시 - 네

jeong-yeon.tistory.com

 

https://velog.io/@haero_kim/Android-Looper-Handler-%EA%B8%B0%EC%B4%88-%EA%B0%9C%EB%85%90

 

[Android] Looper & Handler 기초 개념

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

velog.io

*위 블로그의 내용을 일부 참고하였습니다*

 

https://sunpil.tistory.com/207

 

핸들러(Handler), 루퍼(Looper), 메시지큐(Message Queue)

Handler 스레드 간의 통신장치 1. Looper로부터 받은 Message를 처리한다. 2. 다른 스레드로부터 메시지를 받아서 Message Queue에 넣는 역할을 한다. - Handler는 스레드의 Message Queue와 연계하여 Message나..

sunpil.tistory.com

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..

hungseong.tistory.com

https://codechacha.com/ko/android-handler-basic/

 

반응형