Android

Android 03. 핸들러(Handler)란?

shin96bc 2022. 5. 19. 14:18

(1) Handler 란?

     1) Handler(핸들러) 란 Work Thread 에서 Main Thread 로 메시지를 전달해주는 역할을 하는 Class 입니다.

          Handler 는 Handler 객체를 만든 스레드와 해당 스레드의 Message Queue 에 binding 됩니다.

          Message Queue 는 Handler 가 전달하는 Message 를 보관하는 FIFO( First Int First Out ) 방식의

          Queue 입니다. 다른 스레드에게 Message 를 전달하려면 Message 를 전달하려는 스레드에서

          생성한 Handler 의 post() 와 sendMessage() 등의 메서드를 사용해야 합니다. 

          그래야 수신대상 Message Queue 에 Message 가 저장되기 때문입니다.

          Message Queue 에 저장된 Message 나 Runnable 은 Looper 가 들어온 순서대로 꺼내서 Handler 에게

          전달해줍니다. 그러면 Handler 는 handlerMessage() 메서드를 이용해서 Looper 에게서 받은 

          Message 나 Runnable 을 처리하게 되는 것 입니다.

 

     2) Binding(바인딩) 이란 프로그램의 어떤 기본 단위(변수 등)가 가질 수 있는 구성요소(속성)중에서

          일부 필요한 속성만을 선택하여 연결해주는 것 입니다. 즉, 변수를 예로 들면 변수를 구성하는

          식별자(이름), 자료형 속성, 하나 이상의 주소(참조), 자료값에 구체적인 값, 성격을 확정하는

          것을 말합니다.)

출처: https://salix97.tistory.com/82#google_vignette

 

(2) Handler 의 구성요소

     1) Message( 메시지, android.os.Message )

          <1> Message 는 핸들러를 사용하여 데이터를 보낼 때 필요한 식별자(데이터 구분할 수 있는 이름)와

                 실질적인 데이터를 저장한 객체, 추가 정보를 전달할 객체가 필요한데, 이 전달해야하는

                 데이터를 한 곳에 저장하는 역할을 하는 것이 바로 Message Class 입니다.

          <2> 하나의 데이터를 보내기 위해서는 한 개의 Message 인스턴스가 필요합니다.

          <3> Message 객체를 핸들러로 보내면 해당 객체는 핸들러와 연결된 MessageQueue 에 

                 쌓이게 됩니다. 

                  

     2) MessageQueue( 메시지 큐, android.os.MessageQueue )

          <1> MessageQueue 는 Message 객체를 Queue 형태로 관리하는 자료 구조를 말합니다.

                 Queue 라는 이름대로 FIFO( First Int First Out ) 방식으로 동작하기 때문에 MessageQueue 에

                 들어온 순서대로 차곡차곡 저장되게 됩니다. 그리고 가장 먼저 들어온 Message 객체부터

                 순서대로 처리됩니다.

          <2> 안드로이드의 MessageQueue 는 MessageQueue Class 에 구현되어 있으며, 앱의

                  Main Thread 에서 기본적으로 사용되고 있습니다. 하지만 개발자가 직접 MessageQueue 객체를

                  참조해서 Message 를 전달하거나, Message 를 가져와서 처리하지는 않습니다.

                  그 이유는 Message 의 전달은 Handler(핸들러) 가 하고 Message 를 꺼내서 처리하는 역할은 

                  Looper(루퍼) 가 수행하기 때문입니다.

                 

     3) Looper( 루퍼, android.os.Looper )

          <1> Looper 는 MessageQueue 로 부터 Message 를 꺼내서 해당 Message 와 연결된 Handler 를 

                 호출하는 역할을 합니다. 즉, Thread 에 대한 Message loop(메시지 루프) 를 실행하는 데 

                 사용되는 Class 입니다.

          <2> 기본적으로 Thread 에는 연결된 Message loop 가 없습니다. prepare()(프리페어)  하나를 

                  생성하려면 loop 를 실행할 Thread 를 호출 한 다음 loop() 가 중지될 때까지 Message 를

                  처리하도록 합니다.

          <3> Message loop 와의 대부분의 상호작용은 Handler Class 를 통해 이루어집니다. 

          <4> Android App 의 Main Thread 에는 Looper 객체를 사용하여 Message loop 를 실행하는 

                 코드가 이미 구현되어 있습니다. 즉, Message loop 와 관련된 코드를 개발자가 직접 

                 작성할 필요가 없습니다. 개발자는 그저 MainThread 로 보낼 Message 객체를 만들고,

                 MessageQueue 에 연결된 Handler 에 해당 Message 를 보내기만 하면 됩니다.

 

     4) Handler( 핸들러, android.os.Handler )

          <1> Handler 는 개발자가 Thread Looper 와 연결된 Message Queue 로 Message 를 보내고 처리할 수

                 있게 해주는 역할을 합니다. 

          <2> Handler 는 new 키워드를 통해 생성하여 사용하면 됩니다.(자동으로 queue 와 연결 됩니다.)

          <3> 하나의 Thread 에는 하나의 고유한 Looper 와 Message Looper 만을 가질 수 있지만,

                  Handler 는 개수 제약이 없습니다. 

          <4> Main Thread 는 Looper 를 가지고 있어서 개발자가 관리하지 않아도 되지만, work Thread 에서는

                 개발자가 직접 Looper 를 작성하고 실행해야 합니다.

 

 

바인딩 부분 참고자료:

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=okkam76&logNo=221347019465 

 

https://medium.com/pocs/%EB%B0%94%EC%9D%B8%EB%94%A9-binding-4a4a2f641b27

 

핸들러 부분 참고자료:

https://salix97.tistory.com/82#google_vignette

 

https://developer.android.com/reference/android/os/Handler