Android 스레드(Thread)

HEETAE HEO·2022년 6월 18일
0
post-thumbnail

스레드란?

스레드란, 프로세스내에서 순차적으로실행되는 실행 흐름의 최소 단위를 말합니다.

Android Thread의 종류

Android에서는 모든 스레딩 구성 요소를 두 가지 기본 범주로 분류할 수 있습니다.

Activity/Fragment에 연결된 Thread

생성된 Activity/Fragment의 수명 주기에 연결되어 있으며 Activity/Fragment가 파괴되는 즉시 종료됩니다.

Activity/Fragment에 연결 되지 않은 Thread

생성된 Activity/Fragment(있는 경우)의 수명을 초과하여 계속 실행할 수 있습니다.

(Activity/Fragment에 연결되지 않는 Threading Components : Service, Intent Service)

Main thread

애플리케이션이 Android에서 시작되면 "main" 스레드라고 하는 첫 번째 실행 스레드가 생성됩니다. 기본 스레드는 적절한 사용자 인터페이스 위젯에 이벤트를 전달하고 Android UI toolkit의 구성 요소와 통신하는 역할을 합니다. 애플리케이션의 응답성을 유지하려면 main thread를 사용하여 차단 상태를 유지할 수 있는 작업을 수행하지 않는 것이 중요합니다.

네트워크 작업 및 데이터베이스 호출, 특정 구성 요소 로드는 기본 스레드에서 피해야 하는 작업의 일반적인 예입니다. 메인 스레드에서 호출될 때 동기적으로 호출됩니다. 즉, 작업이 완료될 때까지 UI가 완전히 응답하지 않는 상태로 유지됩니다. 이러한 이유로 일반적으로 별도의 스레드에서 수행되므로 수행되는 동안 UI 차단을 방지합니다.(즉 UI에서 비동기적으로 수행됨)

UI Thread

UI Thread는 애플리케이션의 기본 실행 스레드입니다. 여기에서 대부분의 애플리케이션 코드가 실행됩니다. 모든 애플리케이션 구성 요소(Activities, Services, ContentProviders, BroadcastReceivers)는 이 스레드에서 생성되고 해당 구성 요소에 대한 모든 시스템 호출은 이 스레드에서 수행됩니다.

예를 들어 애플리케이션이 단일 Activity 클래스라고 가정해 보겠습니다. 그런 다음 모든 수명 주기 메서드와 대부분의 이벤트 처리 코드가 이 UI Thread에서 실행됩니다. onCreate, onPause, onDestroy, onClick 등과 같은 메서드 입니다. UI를 업데이트하거나 변경하게 하는 모든 것은 UI 스레드에서 발생해야 합니다.

백그라운드에서 작업을 수행하기 위해 새 스레드를 명시적으로 생성할 때 이 코드는 UI Thread에서 실행되지 않습니다. 이 백그라운드 스레드가 UI를 변경하는 작업을 수행해야 하는 경우 Handler를 사용해야 합니다. 이것은 runOnUiThread을 위한 것입니다. UI를 수정할 수 있는 코드를 실행할 수 있는 기능을 이러한 백그라운드 스레드에 제공합니다. UI 수정 코드를 Runnable 개체에 넣고 runOnUiThread 메서드에 전달하여 이를 수행합니다.

Background Thread와 Handler

UI Thread를 사용하면 작업이 백그라운드 작업을 수행한 다음 결과를 비트맵과 같은 UI 요소로 이동할 수 있습니다.

모든 앱에는 개체와 같은 UI 개체를 실행하는 고유한 특수 스레드가 View objects 로써 있습니다. 이 스레드를 UI Thread라고 합니다. UI Thread에서 실행 중인 개체만 해당 스레드의 다른 개체에 액세스할 수 있습니다. 스레드 풀의 스레드에서 실행하는 작업은 UI Thread에서 실행 되지 않기 때문에 UI 개체에 액세스할 수 없습니다. Background Thread에서 UI Thread로 데이터를 이동하려면 UI Thread에서 Handler를 사용합니다.

Worker thread

안드로이드의 메인 스레드에서 오래 걸리는 작업을 하게되면, 해당 시간 동안 UI처리를 못해주게 되고 이러한 상황(UI 처리를 못해주는 상황)이 지속되면 ANR(Application Not Responding)가 발생하게 됩니다. 이러한 문제 때문에 안드로이드의 데이터베이스 라이브러리인 Room에서는 별도의 옵션 없이는 데이터베이스 작업을 메인 스레드에서 작업을 하려고 하면 오류를 발생시킵니다.

Worker thread는 언제 사용할까?

앞서 말한 데이터베이스 접근을 위한 Room 라이브러리 사용이나, 네트워크 통신처럼 오래 걸리는 작업들은 Worker thread 사용을 필수적으로 권장하고 있습니다. 물론 별도의 옵션으로 Main thread에서 사용하게 만들어 줄 수 있지만, 이는 ANR의 발생 위험을 높이므로 권장하지는 않는 방법이다.

profile
Android 개발 잘하고 싶어요!!!

0개의 댓글