서론
안드로이드의 애플리케이션을 실행하면 시스템은 메인 액티비티를 메모리로 올려 프로세스로 만들며, 이때 메인 스레드가 자동으로 생성됩니다. 메인 스레드는 안드로이드의 주요 컴포넌트를 실행하는 곳이자 UI를 그리거나 갱신하는 일을 담당할 수 있는 유일한 스레드이므로 UI 스레드라고도 불립니다.
안드로이드 UI는 기본적으로 화면을 구성하는 뷰나 뷰그룹을 하나의 스레드에서만 담당하는 싱글 스레드 모델로 작동합니다.
싱글 스레드 모델의 규칙은 다음과 같습니다.
-
메인 스레드(UI 스레드)를 블럭하지 말 것.
-
안드로이드 UI툴킷은 오직 UI스레드에서만 접근할 수 있도록 할 것.
이러한 규칙을 고려하지 않고 긴 시간이 걸리는 작업을 메인 스레드에서 담당한다면 애플리케이션의 성능이 저하될 수 있고, 반응성 또한 낮아질 수 있습니다. 따라서 시간이 걸리는 작업은 여분의 스레드를 이용하여 메인 스레드와 분리해야 합니다. 다른 스레드에서 메인 스레드로 접근하기 위해 필요한 것이 Looper와 Handler입니다.
Looper와 Handler의 사용 목적
위 그림처럼 메인 스레드와 서브 스레드가 병렬 처리로 돌아가고 있는 상황에서 같은 textView를 setText 했을 때 어떤 스레드를 선택할지에 대한 문제가 발생할 수 있습니다. 이러한 동기화 문제를 차단하기 위해서 Looper와 Hanlder를 사용하게 됩니다.
Looper와 Handler의 작동 원리
메인 스레드는 내부적으로 Looper를 가지며 그 안에는 Message Queue가 포함됩니다.
Message Queue는 스레드가 다른 스레드나 혹은 자기 자신으로부터 전달받은 Message를 기본적으로 선입선출 형식으로 보관하는 queue입니다.
Looper는 Message Queue에서 Message나 Runnable 객체를 차례로 꺼내 Handler가 처리하도록 전달합니다. Handler는 Looper로부터 받은 Message를 실행, 처리하거나 다른 스레드로부터 메시지를 받아서 Message Queue에 넣는 역할을 하는 스레드 간의 통신 장치입니다.
Handler
Handler는 스레드의 Message Queue와 연계하여 Message나 Runnable 객체를 받거나 처리하여 스레드 간의 통신을 할 수 있도록 합니다. Handler 객체는 하나의 스레드와 해당 스레드의 Message Queue에 종속됩니다.
특정 스레드에게 메시지를 전달할 때에는 특정 스레드의 Handler의 post나 sendMessage등의 메서드를 호출하면 됩니다.
Looper와 Message Queue
Looper는 루프를 돌며 자신이 속한 스레드의 Message Queue에 들어온 Message나 Runnable 객체를 차례로 꺼내서 이를 처리할 Handler에 전달합니다. 메인 스레드는 Looper가 기본적으로 생성되어 있지만 새로 생성된 스레드에는 기본적으로 Looper가 없습니다. 따라서 prepare() 메서드를 통해 Looper를 생성하고 loop() 메서드를 통해 루프를 실행해야 합니다. 활성화된 Looper를 중단시키는 방법으로는 quit() 메서드와 quitSafely() 메서드가 있습니다.
두 메서드의 차이는 다음과 같습니다.
-
quit() : Looper 즉시 종료
-
quitSafely() : 현재 Message Queue에 쌓인 메시지들을 처리한 후 종료
Message와 Runnable
Message
: 스레드 간 통신할 내용을 담는 객체, 스레드 간 통신할 내용을 포함.
Runnable
: 스레드를 생성할 때 생기는 run() 메서드를 따로 분리 시킨 형태, run() 메서드와 그 내부에서 실행될 코드를 포함.
HandlerThread
메인 스레드가 아닌 새로 생성한 스레드에는 Looper가 없습니다. 이러한 불편함을 개선하기 위해 Looper를 자동으로 보유한 클래스가 제공되는데 이것이 HandlerThread입니다. 자동으로 Looper 내부의 Message Queue도 생성이 되므로 Message나 Runnable을 전달받을 수 있습니다.
참고
'안드로이드' 카테고리의 다른 글
인텐트(Intent) (0) | 2022.05.09 |
---|---|
Android Studio 단축키 (0) | 2021.12.23 |
[안드로이드] ANR(Application Not Responding) (0) | 2021.01.19 |
[안드로이드] Glide 라이브러리 (0) | 2021.01.18 |
[안드로이드] Service (0) | 2021.01.14 |