06-30 00:00
Notice
Recent Posts
Recent Comments
06-30 00:00
«   2024/06   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30
Archives
Today
Total
관리 메뉴

pear

[android] Thread와 Handler 본문

android

[android] Thread와 Handler

pearlab 2023. 8. 9. 14:58

 

Thread와 Handler

 

Handler

핸들러는 핸들러 객체를 만든 스레드와 해당 스레드의 message queue 에 바인딩된다. Message queue 는 핸들러가 전달하는 message 를 보관하는 FIFO(First In First Out) 방식의 큐이다. 다른 스레드에게 메시지를 전달하려면 메시지를 전달하려는 스레드에서 생성한 핸들러의 post() 와 sendMessage() 등의 함수를 사용해야한다. 그래야 수신대상 message queue 에 메시지가 저장되기 때문이다.

message queue 에 저장된 message 나 runnable 은 Looper 가 들어온 순서대로 꺼내서 핸들러에게 전달해준다. 그러면 핸들러는 handlerMessage() 메서드를 이용하여 Looper 에게서 받은 message 나 runnable 을 처리하게 되는 것이다

[번역 : 핸들러를 사용하면 스레드의 MessageQueue와 연결된 Message 및 Runnable 객체를 보내고 처리할 수 있습니다. 각 핸들러 인스턴스는 단일 스레드 및 해당 스레드의 메시지 큐와 연결됩니다. 새로운 Handler를 생성하면 Looper에 연결됩니다. 해당 Looper의 메시지 대기열에 메시지와 실행 파일을 전달하고 해당 Looper의 스레드에서 실행합니다.]

 

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

스레드 통신에서 핸들러를 사용하여 데이터를 보내기 위해서는, 데이터 종류를 식별할 수 있는 식별자와 실질적인 데이터를 저장한 객체, 그리고 추가 정보를 전달할 객체가 필요합니다. 즉, 전달할 데이터를 한 곳에 저장하는 역할을 하는 클래스가 필요한데요, 이 역할을 하는 클래스가 바로 Message 클래스입니다. (https://developer.android.com/reference/android/os/Message)

하나의 데이터를 보내기 위해서는 한 개의 Message 인스턴스가 필요하며, 일단 데이터를 담은 Message 객체를 핸들러로 보내면 해당 객체는 핸들러와 연결된 메시지 큐(Message Queue)에 쌓이게 됩니다.

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

메시지 큐(Message Queue)는 이름 그대로 Message 객체를 큐(Queue) 형태로 관리하는 자료 구조를 말합니다. 큐(Queue)라는 이름답게 FIFO(First In First Out) 방식으로 동작하기 때문에, 메시지는 큐에 들어온 순서에 따라 차례대로 저장됩니다. (First In). 그리고 가장 먼저 들어온 Message 객체부터 순서대로 처리됩니다. (First Out).(https://developer.android.com/reference/android/os/MessageQueue)

안드로이드의 메시지 큐는 MessageQueue 클래스에 구현되어 있으며, 앱의 메인 스레드에서 기본적으로 사용되고 있습니다. 하지만 개발자가 MessageQueue 객체를 직접 참조하여 메시지를 전달하거나, 메시지를 가져와서 처리하지는 않습니다. 메시지 전달은 메시지 큐에 연결된 핸들러(Handler)를 통해서, 그리고 메시지 큐로부터 메시지를 꺼내고 처리하는 역할은 루퍼(Looper)가 수행하기 때문입니다.

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

MessageQueue는 Message 객체 리스트를 관리하는 클래스일 뿐, 큐에 쌓인 메시지 처리를 위한 핸들러를 실행시키지는 않습니다. 메시지 루프, 즉, 메시지 큐로부터 메시지를 꺼내온 다음, 해당 메시지와 연결된 핸들러를 호출하는 역할은 루퍼(Looper)가 담당합니다. "루퍼(Looper)"라는 이름에서 알 수 있듯이, 메시지 처리를 위한 메시지 루프(Message loop)를 실행하는 것이죠. (https://developer.android.com/reference/android/os/Looper)

안드로이드 앱의 메인 스레드에는 Looper 객체를 사용하여 메시지 루프를 실행하는 코드가 이미 구현되어 있고, 해당 루프 안에서 메시지 큐의 메시지를 꺼내어 처리하도록 만들어져 있습니다. 메인 스레드에서 메시지 루프와 관련된 코드를 개발자가 추가적으로 작성할 필요는 없는 것이죠. 개발자가 할 일은, 메인 스레드로 전달할 Message 객체를 구성하고, 스레드의 메시지 큐에 연결된 핸들러(Handler)를 통해 해당 메시지를 보내기만 하면 됩니다.

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

핸들러(Handler)는 스레드의 루퍼(Looper)와 연결된 메시지 큐로 메시지를 보내고 처리할 수 있게 만들어줍니다. 메인 스레드의 메시지 처리 흐름에서, 메시지 전달과 처리를 위해 개발자가 접근할 수 있는 창구 역할을 수행한다고 할 수 있죠.(https://developer.android.com/reference/android/os/Handler)

스레드와 연관된 핸들러를 얻기 위해서는, 간단하게 new 키워드를 사용하여 Handler 클래스 인스턴스를 생성하기만 하면 됩니다. 그러면 새로운 Handler 인스턴스는 자동으로 해당 스레드와 메시지 큐에 연결(bound)되고, 그 시점부터 핸들러를 통해 메시지를 보내고 처리할 수 있게 됩니다.

출처 : https://recipes4dev.tistory.com/166