안녕하세요 :) 오늘은 메인스레드, main() 함수라는 것이 무엇인지 살펴보고, 안드로이드 환경에선 이 개념이 어떻게 적용되는지 알아보려합니다. 안드로이드 메인스레드의 역할, 생성, 특징에 대해 알아볼 것입니다. 또한 UI 작업에 대한 단일스레드 모델과 관련하여, ANR에 대해서 알아보려합니다. 오늘도 화이팅 입니다 ! 🌿
앱에 포함된 액티비티 중 하나를 런처로 지정함으로써, 앱의 시작점, 즉 앱 프로세스의 시작점을 지정해줄 수 있습니다.
여러분들이 AndroidManifest.xml에 작성하셨던 가 바로 런처를 지정하는 부분이 됩니다.
이렇게 앱 프로세스의 시작점을 지정하는 것까진 알겠는데, 안드로이드 개발을 하면서 직접 main() 함수를 적어본적이 없을텐데요. 안드로이드 앱의 main()는 안드로이드 프레임워크에 존재하기 때문입니다.
기본적으로 저희가 개발하는 안드로이드 앱은 안드로이드 프레임워크 위에서 동작합니다.
즉 main()는 저희가 작성하는 코드 범위가 아니라, 안드로이드 프레임워크에 위치합니다. 더 정확히는 android.app.ActivityThread 클래스에 위치한 main()함수가 실행되며 앱 프로세스가 시작되는 것입니다. 이 main()함수 안에서 메인 스레드가 준비되고 실행됩니다. 메인스레드가 실행되고나선 앞서 런처로 지정한 액티비티를 실행(UI 작업)하게 됩니다.
안드로이드의 메인스레드는 컴포넌트 생명주기 메서드와 그 안의 메서드 호출을 기본적으로 담당하고 있습니다.
따라서 안드로이드의 메인스레드의 주요 업무 중엔 UI 작업도 포함 됩니다. 여기서 큰 특징으로, 안드로이드 메인스레드가 UI 작업을 할땐, 단일스레드 모델이 적용된다는 점입니다.
한마디로 정리하면, UI 작업에 있어 경합 상태, 교착 상태를 방지하고자, 메인스레드엔 단일 스레드 모델이 적용됩니다.
하나의 위젯에 멀티 스레드를 사용한다고 하면, 앞서 언급한, 동일 자원에 대한 교착 상태, 경합 상태등의 문제가 발생될 수 있습닌다.
단일 스레드 모델은 자원 접근에 대한 동기화를 신경쓰지 않아도 되고, 작업전환(context switching) 비용을 요구하지 않으므로, 경합 상태와 교착 상태를 방지할 수 있다.
또 만약 하나의 액티비티에 N개의 위젯이 있고, 각 위젯에 대한 작업을 위해 N개의 멀티 스레드를 사용한다고 가정하면, 각 위젯이 그려지거나 업데이트되는 순서를 보장할 수 없게 됩니다.
안드로이드에서의 단일 스레드 모델이란 안드로이드 화면을 구성하는 뷰나 뷰그룹을 하나의 스레드에서만 담당하는 원칙을 말합니다. 단일 스레드 모델은 아래 두 가지 규칙을 갖습니다.
첫째, 메인 스레드(UI 스레드)를 블럭하지 말 것
둘째, 안드로이드 UI 툴킷은 오직 메인 스레드(UI 스레드)에서만 접근할 수 있도록 할 것
따라서, UI 작업은 단일스레드 환경에서만 이뤄져야하며, 이 UI 작업을 맡고 있는 메인스레드가 UI 작업을 할 땐, 단일스레드 원칙에 맞게 동작해야하는 것입니다.
작성 중....!!
공부 중입니다 ~,~