handler는 그 이름 그대로 해석해보면 뭔가를 다루는 녀석이다.
쓰레드에서 사용되며 대충 유추해보자면 쓰레드에서의 어떠한 작업을 위해 기능을 수행하는 녀석정도로 느낌이 온다.
복잡하고 어렵지만 한번 알아보도록 하자
handler는 쓰레드 간 상호작용을 위한 일반적인 목적의 클래스이고,
Message와 runnable 객체의 처리를 담당한다.
runnable 메시지는 run() 메서드를 호출하여 처리하고 message는 handleMessage() 메서드를 이용해 처리한다.
흐름을 보자면
혼자선 아무것도 하지 못한다
여기까지 봤을 때 알 수 있는건 handler는 아주 의존적이라는 것이다.
thread와 Looper, MessageQueue가 있어야 뭔가를 할 수 있는 녀석이다.
looper는 하나의 스레드만 담당하여 메시지가 들어오면 꺼내서 적절한 handler로 전달하는 작업을 반복적으로 수행한다.
(참고 : https://itmining.tistory.com/5)
handler에서 사용하는 함수들 * 사진출처
어플리케이션이 실행될 때 가장 먼저 실행되는 하나의 스레드를 메인스레드 또는 UIthread라고 한다.
이 메인 스레드는 화면 구성의 역할을 담당한다.
각종 위젯등의 생성 및 조작 시 상호작용이 되는 스레드가 메인스레드이다.
UIthread에서 지켜야하는 규칙
UIthread에서는 두 가지 규칙을 지켜야 한다.
이 UIthread는 화면의 UI를 업데이트하는 작업 스레드로 단일 스레드이다.
단일 스레드이기때문에 작업이 순차적으로 진행되는데, UI를 업데이트 하려하는데 다른 긴 작업들이 중간에 껴있다고 생각해보자.
UIthread는 먼저온 작업부터 순차적으로 처리해야 하는 녀석이라 긴 작업이 중간에 껴있으면 어떤 상황이 일어날까.
긴 작업을 수행하는 동안 UI는 응답없음 상태가 되버린다.
하지만 work thread에서 작업을 수행하면 UIthread에서 UI작업은 문제없이 수행된다.
다른 곳에서 자료를 받아오는 것은 네트워크 작업이라 UIthread에서 수행할 수 없다. 그렇다고 직접 work thread에서 작업을하면 직접 UI를 수정할 수가 없다.
이럴 때 handler를 사용한다.
handler는 자기가 생성된 스레드에서의 작업을 순차적으로 처리한다.
따라서,