안드로이드 - Thread 개념 및 종류와 Handler, Looper, MessageQueue
목차
- Thread란?
- 안드로이드 Thread 종류 (메인 스레드 vs 작업자 스레드)
- 메인 스레드와 Handler, Looper, MessageQueue
1. Thread란?
우리가 프로그램을 실행시키면 메모리상에 해당 프로그램이 로딩되어 실행됩니다. 메모리상에 로딩된 프로그램은 운영체제에 의해서 관리되고, 이때 실행중인 프로그램을 프로세스(Process)라고 합니다.
스레드(Thread)는 이러한 프로세스(Process)상에서 실행되는 하나의 작업 수행 단위를 말하며, 여러개의 스레드를 생성하여 사용할 수 있습니다. 여기에서는 안드로이드에서 사용되는 스레드의 종류와 Looper 및 Handler, Message, MessageQueue의 개념에 대해서 알아보도록 하겠습니다.
2. 안드로이드 Thread 종류 (메인 스레드 vs 작업자 스레드)
1) 메인 스레드 (UI 스레드)
메인스레드(Main Thread)는 안드로이드 앱을 동작시킬 경우, 프로세스(Process)와 함께 최초로 실행되는 스레드(Thread)를 말합니다.
이 메인스레드를 UI스레드라고도 부릅니다. 왜냐하면 안드로이드에서 화면에 나타내는 UI 기능, 즉 화면에 무언가를 그리는 기능은 오직 메인스레드에서만 동작시킬수 있기 때문입니다.
따라서 메인스레드에서는 시간이 오래 걸리는 작업 수행은 하지 말아야 합니다. 만약 메인스레드에서 작업 수행으로 인하여 화면 클릭이나 터치 이벤트 등에 5초 이내에 응답하지 못하게 되면 시스템에서 앱을 강제 종료할 수 있게 하는 ANR(Application Not Responding) 창이 나타납니다.
2) 작업자 스레드 (Worker 스레드)
앞에서 설명한 바와 같이 메인스레드는 작업 수행의 제약 때문에, DB작업이나 네트워크를 통한 다운로드 등 시간이 오래 걸리는 작업 수행은 작업자 스레드(Worker 스레드)를 만들어서 사용해야 합니다.
작업자 스레드를 만드는 방법은 기존 자바 문법과 같으며 아래와 같이 두가지 방법이 있습니다.
- Thread 클래스를 상속하여 생성하는 방법
- Runnable 인터페이스를 구현하여 생성하는 방법
cf) 스레드 구현 및 사용방법은 아래 글을 참고하세요.
2022.08.01 - [IT 개발/Java] - [Java] 자바 - Thread란? 스레드 개념 및 사용방법
3. 메인 스레드와 Handler, Looper, MessageQueue
안드로이드에서 스레드를 사용하다보면 거의 필연적으로 스레드간 데이터 전송을 해야 하는 일이 발생합니다. 왜냐하면 UI처리를 메인 스레드에서만 처리 할 수 있기 때문입니다. Looper, Handler, Message, MessageQueue 등은 이 때 알아두어야 할 내용들로 여기에서 간략하게 알아보도록 하겠습니다.
- Message는 작업정보가 담겨져 있는 객체를 말합니다.
- MessageQueue는 Message객체를 Queue형태의 자료구조로 관리하는 객체를 말합니다.
- Looper는 MessageQueue에 담겨 있는 Message객체를 해당 Handler에 전달하는 역할을 하며, 메인스레드(UI스레드)에는 기본적으로 Looper가 실행되어 있습니다.
- Handler에서는 Message객체를 전달 받아 해당 실행코드를 수행하며, 또한 sendMessage( )메소드를 통해 MessageQueue에 Message 객체를 전달하는 역할도 수행합니다.
cf) 참고사항
- 메인 스레드에서는 Looper가 기본적으로 돌고 있지만, 작업자 스레드에서는 따로 Looper를 준비해야합니다.
- 기본생성자 Handler( )로 Handler 인스턴스를 생성한 경우, 인스턴스를 생성한 스레드의 Looper와 MessageQueue에 연결되었습니다. 그런데 기본 생성자 Handler( )가 현재 deprecatred 되었고 지금은 Handler(Loopper looper) 생성자로 사용할 Looper를 명시적으로 지정하도록 바뀌었습니다.
ex1) mHandler = new Handler(Looper.getMainLooper()) { ... }
ex2) mHandler = new Handler(Looper.myLooper()) { ... }
cf) 스레드간 통신 예제에 대해서는 아래글을 참고하세요
2023.03.08 - [IT 개발/Android] - [안드로이드] Thread간 통신 및 데이터 전달 방법
'IT 개발 > Android' 카테고리의 다른 글
[안드로이드] Room 사용방법 및 예제 + LiveData적용 (0) | 2023.03.09 |
---|---|
[안드로이드] Thread간 통신 및 데이터 전달 방법 (0) | 2023.03.08 |
[안드로이드] CardView 사용법 및 속성 (0) | 2023.02.28 |
[안드로이드] DatePickerDialog 사용법 및 Theme 옵션 (Spinner, Calendar 날짜선택) (0) | 2023.02.21 |
[안드로이드] 4대 컴포넌트(component)의 특징 및 실행방법 (0) | 2022.09.15 |