프로세스와 스레드

임찬형·2022년 2월 4일
0

Android 기본

목록 보기
3/7

프로세스와 스레드

  • 프로세스에는 하나의 메인 스레드 존재. (메인 스레드 종료 시 프로세스 종료)

메인 스레드

  • 각종 생명주기 함수 실행
  • 화면에 UI를 그리는 역할 (UI 스레드라고도 불림)
  • 메인 스레드에서 무거운 작업을 처리하면 다른 중요한 처리가 미뤄짐(그리기, 생명주기 등)

+) ANR (Application Not Responding): 메인 스레드가 5초 이상 잠기면 강제로 앱 종료

메인 스레드에서 디스크 쓰기, 읽기, 네트워크 사용 3가지를 메인 스레드 사용 위반(스트릭트 모드 위반)이라 부름

메인 스레드와 워커 스레드

  • 메인 스레드 외에는 화면에 그리는 작업을 할 수 없음
    화면에 뷰를 그리는 것은 순서가 매우 중요함. 워커 스레드는 처리 순서 불분명

  • 따라서 워커 스레드에서 작업 후 UI를 그리고 싶다면 메인 스레드에 그려 달라 요청해야 함

Looper

  • 메인 스레드가 생성하며, loop 함수를 통해 무한 반복하여 메인 스레드가 종료됨을 방지함 (프로세스 유지)

  • Looper 객체 생성 시 내부에 메시지 큐를 생성하고, 매 loop마다 메시지가 존재하면 추출 후 처리, 존재하지 않으면 Sleep

  • 워커 스레드에서 Looper의 메시지 큐에 UI를 그리는 등의 요청을 담은 메시지를 보내고, 메인 스레드는 이를 꺼내어 작업

Handler

  • Looper의 메시지 큐에 메시지를 전달하는 클래스

  • Handler 객체는 생성 시 메인 스레드의 Looper 객체를 참조함.

  • 워커 스레드에서 Handler 객체 생성하고 메인 스레드의 Looper로 메시지 전송

  • 추가로, Handler객체를 직접 생성할 수 있지만 뷰와 액티비티는 자체적으로 Handler를 가짐
    ex) view.post 함수, activity.runOnUiThread 함수로 메시지 전달 가능

메시지를 설정하는 두 가지 방법

  1. Message 객체를 통해 직접 Handler의 메시지 구성 변수들을 설정함
    (Handler의 handleMessage 함수를 재정의)

  2. Runnable 인터페이스 구현 객체 (run 함수 재정의)를 메시지에 넣어 전달
    (Handler의 post 함수에 객체 전달)

+) Looper는 매 loop마다 메시지 큐에서 메시지를 꺼내 Runnable 객체 존재 시 run 함수를 호출하고 없으면 handleMessage 함수를 호출

0개의 댓글