-
[Android] Handler/Looper 기초Android/Android 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
https://velog.io/@haero_kim/Android-Looper-Handler-%EA%B8%B0%EC%B4%88-%EA%B0%9C%EB%85%90
*위 블로그의 내용을 일부 참고하였습니다*
https://sunpil.tistory.com/207
https://hungseong.tistory.com/26
https://codechacha.com/ko/android-handler-basic/
반응형'Android > Android' 카테고리의 다른 글
[Android] 런치모드(LaunchMode) (0) 2022.10.19 [Android] 암시적 인텐트(Intent)와 resolveActivity() (0) 2022.10.07 [Android] Privacy Policy로 플레이 스토어 앱 등록 개인 정보 처리 방침 만들기 (0) 2022.09.21 [Android] 의존성 주입(DI/Dependency Injection) (0) 2022.09.06 [Android] Fragment에서 binding null 처리 (2) 2022.08.31