- Today
- Total
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- ai
- androidstudio
- 책리뷰
- 안드로이드
- 책추천
- pullrequest
- coroutine
- PR
- KotlinInAction
- CustomTab
- 학습지
- github
- 코틀린
- webflux
- jlpt
- suspend
- posting
- rxjava
- Android
- Kotlin
- 일본어문법
- n3문법
- 진짜학습지후기
- GIT
- blog
- errorhandling
- 진짜학습지
- 인공지능
- 일본어기초
- 진짜일본어
코딩하는 개굴이
[JAVA/안드로이드] Handler, Looper, Thread 본문
항상 한 세트로 등장하지만 정확히 무엇인지 모르겠던 저 세가지 아이들을 한꺼번에 정리해보려한다.
아래 나올 내용들을 한줄 정리로 스포해보자면 결론적으로 Handler, Looper, Thread 사이의 관계는
Handler, Looper는 Thread에 사용되는 역할이라는 것이다.
시작하기 전에, 이 모든 설명은 Android 의 "Single Thread System" 으로부터 뻗어나가기 때문에
정확히 무엇인지 모르겠다면 아래 포스팅에서 관련 내용을 참고하는 것을 권장하고 싶다.
Android 의 "Single Thread System" 의 원칙
위 문서에 언급되어있지만 Android의 Single Thread System 은 두가지 원칙이 존재한다.
- MainThread인 UI Thread 를 중지(Block)하지 않는다.
- Android의 UI Toolkit(TextView, ImageView 등..)은 전부 MainThread에서만 접근 가능하다.
따라서, 긴 시간이 걸리는 작업을 MainThread에서 작업할 경우 UI의 처리는 미뤄질 수 있다. 이것이 지속되면 ANR(Application Not Responding) 오류가 발생한다.
그렇다면, 오래 걸리는 작업들은 어떻게 처리해야하는 것일까?
Android에서는 MainThread에서 여분의 Thread 즉 SubThread를 가져와 DB, REST(서버 통신) 등의 오랜 시간이 걸릴 수 있는 작업들을 수행하며 이를 MultiThread 방식이라고 한다.
MultiThread 방식
위의 설명처럼 MultiThread 를 사용한다고 가정해보자. 만일 그럴 경우, MainThread와 SubThread가 동시에 UI 처리를 시도할 경우는 어떻게 될까?
만일 각 Thread 들의 동기화가 충분히 되지 않는다면 오작동이 발생할 것이다.
따라서, Android에서는 오작동을 막기 위해 Thread 간의 통신을 필요로하며 이를 위해 Handler와 Looper가 사용되는 것이다.
(이 설명까지 먼길을 돌아왔다. 드디어 본론이다!)
Handler
Handler는 작업(Message, Runnable)을 다른 Thread에 보내거나(post(new Runnable()) Looper에게 전달받은 작업을 처리한다. (handle Message()) 보낸 작업은 보낸 Thread의 Message Queue에 담긴다.
# post로 작업을 다른 Thread에 보내기 |
보내고 싶은 Thread의 Handler를 호출해 post를 실행해 넣는다. 예시로, MainThread에 보내고자 할 때는 mainThreadHandler.post(new Runnable()) 이렇게 수행되게 될 것이다. |
Looper
Thread 내에서 Message Queue를 탐색하며 작업이 생기면 Handler로 전달하는 역할을 수행하며 Thread 당 1개만 가질 수 있다.
- prepare(): Looper를 생성한다.
- loop(): MessageQueue에 생긴 작업을 handler로 전달한다.
- quit(): Looper를 종료한다.
- quitSafely(): Queue의 작업을 전부 완료한 후 종료한다.
둘 간의 관계를 간략히 그림으로 축약해보았다.
Looper와 Handler는 Thread간의 통신을 위해 사용하며,
Handler는 작업을 다른 Thread에 보내거나 Looper에게 전달 받은 작업을 처리하는 역할을 수행하고,
Looper는 MessageQueue를 탐색하며 작업이 생기면 이를 Handler로 전달하는 역할을 수행한다.
'안드로이드' 카테고리의 다른 글
[안드로이드] Launch Mode 란? (0) | 2022.10.26 |
---|---|
[안드로이드] Volley 의 간단한 사용법 (0) | 2022.09.12 |
[안드로이드] SingleThread 상태와 MultiThread 상태 (0) | 2022.09.05 |
[안드로이드] Fastlane과 GitHub Action을 이용한 자동 배포 시스템 구축하기 - Fastlane 배포 설정 (1) (0) | 2022.05.01 |
[안드로이드] Could not connect to remote process. Aborting debug session. 해결법 (0) | 2022.03.09 |