POST

[안드로이드] 코틀린 핸들러와 루퍼

2022.01.26 - [Android] - [안드로이드] 코틀린 메인스레드 / 백그라운드스레드

2022.01.26 - [Android] - [안드로이드] 코틀린 Thread 클래스 / Runnable 인터페이스 사용

2022.01.27 - [Android] - [안드로이드] 코틀린 스레드(Thread)연습 - 타이머 만들기

메인 스레드와 백그라운드 스레드

메인 스레드로 집중될 코드를 백그라운드 스레드로 분산하게 되면 효율적인 앱을 만들 수 있습니다.

다만 주의할 점은 안드로이드에서는 '백그라운드 스레드는 UI 구성요소에 접근 할 수 없다'는 중요한 규칙이 있습니다.

UI구성요소는 메인 스레드만 접근하여 업데이트 할 수 있으며 해당 제약사항은 윈도우나 다른 앱에서도 공통적으로 적용됩니다.

따라서 해당 제약을 따라 메인 스레드와 백그라운드 스레드 사이에서 처리하기위해 핸들러와 루퍼가 사용됩니다.

 

핸들러와 루퍼

안드로이드는 메인 스레드와 백그라운드 스레드 및 스레드간의 통신을 위해 핸들러(Handler)와 루퍼(Looper)를 제공합니다. 

  • 메인 스레드는 내부적으로 루퍼를 가지며 루퍼는 Message Queue를 포함함
  • Message Queue는 다른 스레드혹은 스레드 자기 자신으로부터 전달 받은 메세지를 보관하는 Queue임
  • 루퍼는 Message Queue에서 메세지, Runnable 객체를 차례로 꺼내서 핸들러가 처리하도록 전달함
  • 핸들러는 루퍼로부터 받은 메세지, Runnable 객체를 처리하거나 메세지를 받아서 Message Queue에 넣는 스레드간의 통신 장치

 

루퍼(Looper)

루퍼는 MainActivity가 실해됨과 동시에 for문 하나가 무한루프 돌고 있는 서브스레드라고 생각하면 된다. 이 무한루프는 대기하고 있다가 자신의 큐에 쌓인 메시지를 핸들러에 전달한다. 여러 개의 백그라운드에서 큐에 메시지를 입력하면, 입력된 순서대로 하나씩 꺼내서 핸들러에 전달한다.

 

핸들러(Handler)

핸들러는 루퍼가 있는 메인 스레드(MainActivity)에서 주로 사용되며 새로 생성된 스레드들과 메인 스레드와의 통신을 담당한다. 핸들러는 루퍼를 통해 전달되는 메시지를 받아서 처리하는 일종의 명령어 처리기로 사용된다.

루퍼는 앱이 실행되면 자동으로 하나 생성되어 무한루프를 돌고 있지만, 핸들러는 개발자가 직접 생성해서 사용해야 한다.

 

메시지(Message)

메시지는 루퍼의 큐에 값을 전달하기 위해서 사용되는 클래스이다. Message 객체에 미리 정의 해둔 코드를 입력하고, 큐에 담아두면 루퍼가 꺼내어 핸들러에 전달한다.