[Android] Handler, UIthread 뭘까?

moKo·2021년 9월 15일
0

Android

목록 보기
2/13

👁 Handler란?

Handler 구글문서

handler는 그 이름 그대로 해석해보면 뭔가를 다루는 녀석이다.
쓰레드에서 사용되며 대충 유추해보자면 쓰레드에서의 어떠한 작업을 위해 기능을 수행하는 녀석정도로 느낌이 온다.
복잡하고 어렵지만 한번 알아보도록 하자

handler는 쓰레드 간 상호작용을 위한 일반적인 목적의 클래스이고,
Message와 runnable 객체의 처리를 담당한다.
runnable 메시지는 run() 메서드를 호출하여 처리하고 message는 handleMessage() 메서드를 이용해 처리한다.

흐름을 보자면

  1. 메시지는 다른 스레드에 속한 Message Queue에서 전달된다.
  2. Message Queue에 메시지를 넣을땐 handler의 sendMessage()를 이용한다.
  3. Looper는 MessageQueue에서 Loop()를 통해 반복적으로 처리할 메시지를 handler에 전달한다.
  4. handler는 handleMessage를 통해 메시지를 처리한다.

혼자선 아무것도 하지 못한다

여기까지 봤을 때 알 수 있는건 handler는 아주 의존적이라는 것이다.
thread와 Looper, MessageQueue가 있어야 뭔가를 할 수 있는 녀석이다.

Looper가 하는일

looper는 하나의 스레드만 담당하여 메시지가 들어오면 꺼내서 적절한 handler로 전달하는 작업을 반복적으로 수행한다.

(참고 : https://itmining.tistory.com/5)

handler에서 사용하는 함수들 * 사진출처

👁 UIthread

어플리케이션이 실행될 때 가장 먼저 실행되는 하나의 스레드를 메인스레드 또는 UIthread라고 한다.
이 메인 스레드는 화면 구성의 역할을 담당한다.
각종 위젯등의 생성 및 조작 시 상호작용이 되는 스레드가 메인스레드이다.

UIthread에서 지켜야하는 규칙

UIthread에서는 두 가지 규칙을 지켜야 한다.

  1. 긴 작업은 지양한다.
  2. work thread에선 UI 작업을 하지 않는다.

Q. 왜 긴 작업은 지양해야 할까

이 UIthread는 화면의 UI를 업데이트하는 작업 스레드로 단일 스레드이다.
단일 스레드이기때문에 작업이 순차적으로 진행되는데, UI를 업데이트 하려하는데 다른 긴 작업들이 중간에 껴있다고 생각해보자.

UIthread는 먼저온 작업부터 순차적으로 처리해야 하는 녀석이라 긴 작업이 중간에 껴있으면 어떤 상황이 일어날까.
긴 작업을 수행하는 동안 UI는 응답없음 상태가 되버린다.

하지만 work thread에서 작업을 수행하면 UIthread에서 UI작업은 문제없이 수행된다.

Q. work thread에서 UI작업을 하지 않는 이유

다른 곳에서 자료를 받아오는 것은 네트워크 작업이라 UIthread에서 수행할 수 없다. 그렇다고 직접 work thread에서 작업을하면 직접 UI를 수정할 수가 없다.

이럴 때 handler를 사용한다.

handler는 자기가 생성된 스레드에서의 작업을 순차적으로 처리한다.
따라서,

  1. UIthread에서 handler 객체를 생성하고
  2. work thread에서 필요한 위치의 handler 객체를 꺼내서
  3. handler의 post나 sendMessage 메소드 등으로 요청할 수 있다.
profile
🔥 Feelings fade, results remain

0개의 댓글