+) ANR (Application Not Responding): 메인 스레드가 5초 이상 잠기면 강제로 앱 종료
메인 스레드에서 디스크 쓰기, 읽기, 네트워크 사용 3가지를 메인 스레드 사용 위반(스트릭트 모드 위반)이라 부름
메인 스레드 외에는 화면에 그리는 작업을 할 수 없음
화면에 뷰를 그리는 것은 순서가 매우 중요함. 워커 스레드는 처리 순서 불분명
따라서 워커 스레드에서 작업 후 UI를 그리고 싶다면 메인 스레드에 그려 달라 요청해야 함
메인 스레드가 생성하며, loop 함수를 통해 무한 반복하여 메인 스레드가 종료됨을 방지함 (프로세스 유지)
Looper 객체 생성 시 내부에 메시지 큐를 생성하고, 매 loop마다 메시지가 존재하면 추출 후 처리, 존재하지 않으면 Sleep
워커 스레드에서 Looper의 메시지 큐에 UI를 그리는 등의 요청을 담은 메시지를 보내고, 메인 스레드는 이를 꺼내어 작업
Looper의 메시지 큐에 메시지를 전달하는 클래스
Handler 객체는 생성 시 메인 스레드의 Looper 객체를 참조함.
워커 스레드에서 Handler 객체 생성하고 메인 스레드의 Looper로 메시지 전송
추가로, Handler객체를 직접 생성할 수 있지만 뷰와 액티비티는 자체적으로 Handler를 가짐
ex) view.post 함수, activity.runOnUiThread 함수로 메시지 전달 가능
Message 객체를 통해 직접 Handler의 메시지 구성 변수들을 설정함
(Handler의 handleMessage 함수를 재정의)
Runnable 인터페이스 구현 객체 (run 함수 재정의)를 메시지에 넣어 전달
(Handler의 post 함수에 객체 전달)
+) Looper는 매 loop마다 메시지 큐에서 메시지를 꺼내 Runnable 객체 존재 시 run 함수를 호출하고 없으면 handleMessage 함수를 호출