What is UI Thread and Why is only one in android?
안드로이드 앱을 실행하면 Main Activity가 Memory 위에 올라가게 되고 이때 Main Thread가 생성되게 된다.
이때 Main Thread는 해당 앱의 UI를 담당하는 유일한 스레드이므로 UI Thread라고도 한다.
기본적으로 안드로이드 UI는 Single thread 방식으로 동작하므로(UI Thread) 이를 간과한 채 개발하게 된다면 앱이 중지하거나 느려지는 모습(Application Not Responding, ANR)을 보게된다.
따라서 우리는 메인 스레드(UI Thead)에서는 화면의 요소만 담당하도록 하고, 그 과정을 처리하는 것은 Sub Thread로 보내 작업을 처리하도록 만들어야 한다.
이때 왜 UI Thread가 하나여야 하는지는 아래와 같은 상황을 고려해보자.
<< 만약 UI Thread가 여러개인 경우 >>
A Thread와 B Thread가 동시에 textView.setText("A Thread!!") / textView.setText("B Thread!!")를 한다면
실제로 setText는 어떤 것이 되어야 할 지 race condition에 빠지게 된다.
따라서 클라이언트가 바라보는 UI의 동기화를 확실하게 하기 위해 UI Thread는 하나로 한정하는 것이다.
따라서 이렇게 Sub Thread에서 Main Thread에 접근하기 위해 안드로이드에서는 Handler, Looper, Thread를 제공해주고 있다.
Handler
핸들러는 스레드의 Message Queue에서 던져주는 Message 혹은 Runnable을 처리하는 역할을 한다.
이때 Handler 객체는 Handler를 생성한 해당 스레드의 객체에 종속(바인드) 된다.
따라서 A 스레드에서 B 스레드로 어떤 메시지나 Runnable를 전달하기 위해서는 특정 스레드에 속한 Handler로 post나 sendMessage와 같은 메서드를 이용할 수 있다.
이렇게 보낸 메시지를 받아 처리하는 메서드는 handleMessage를 구현하여 사용 할 수 있다.
이렇게 핸들러는 쓰고자 하는 방법에 따라 다양하게 사용 할 수 있다.(타이머, 스케줄링 등등)
Looper
Looper는 자신을 생성한 스레드의 Message Queue에 들어오는 Message, Runnable를 순서대로 Handler에 전달하는 역할을 한다.
이때 메인 스레드는 Looper가 기본적으로 생성되어 있지만, 새로 생성한 다른 스레드는 Looper을 생성하지 않기에 메시지나 Runnable을 받으려면 Looper을 새성해야 한다.
(prepare() 메서드를 통해 Looper를 생성하고 loop() 메서드를 통해 Looper가 무한 루프를 돌도록 만들어 메시지큐를 관리하도록 해준다.)
Looper, Handler의 작동 원리
메인 스레드는 내부적으로 Looper을 가지고 있고 그 속에 Message Queue가 존재한다.
이때 Message Queue는 자기 자신 혹은 다른 스레드로 부터 받은 Message이나 Runnable 객체를 순서대로 꺼내 Handler가 처리하도록 전달한다.
이때 Handler를 Looper에게 받은 Message를 순서대로 처리하게 된다.
Message 그리고 Runnable
Message는 스레드 간 통신할 내용을 담는 객체다.
이때 Message가 필요할 때 새로운 Message 객체를 생성하면 성능상 이슈가 생길 수 있기에 안드로이드 시스템에서 제공하는 Message Pool 객체를 재사용 하게 된다.
Runnable은 Runnable 인터페이스를 구현한 객체다.
따라서 Message와 Runnable의 차이로 Message는 스레드 간 통신하고자 하는 내용을 담는 것이고, Runnable은 해당 핸들러 스레드가 실행할 run() 메서드와 그 내부에서 실행될 코드를 담는다는 차이가 있다.
참고 사이트
https://academy.realm.io/kr/posts/android-thread-looper-handler/
'Basic > Android' 카테고리의 다른 글
안드로이드 그림 그리기 기본 (0) | 2019.09.07 |
---|---|
안드로이드 툴바 만들기 (0) | 2019.09.03 |
익명 클래스 예제 (0) | 2019.08.30 |
안드로이드 Activity Lifecycle (0) | 2019.08.09 |
Android Bundle이란? (0) | 2019.08.01 |