Handler를 이해하는 데 알아야 할 사항
Handler를 이해하려면 먼저 Android의 기본 규칙을 알아두면 더 쉽게 이해할 수 있습니다.
그 때문에, 우선은 그 룰에 대해서 알아보겠습니다.
Android 앱에는 규칙이 있습니다!
Android 앱의 기본인 Activity는 Looper라는 스레드에서 실행됩니다.
이 스레드는 UI를 제어하므로 UI 스레드라고 합니다.(※ Looper = UI 스레드가 아닙니다. Looper는 여러 가지이며 활동을 움직이고 있는 Looper를 UI 스레드라고 합니다)
여기서 중요한 포인트입니다.
Android 앱의 경우
- 무거운 처리를 UI 스레드에서 수행해서는 안됩니다.
- UI 업데이트는 항상 UI 스레드에서 수행됩니다.
라는 규칙이 있습니다.
이것을 모르고 개발을 하면, 무거운 처리를 했을 때, 소스 코드상, 버그는 없는데 왠지 강제 종료라는 의미 불명한 자체가 일어나기도 합니다.
다중 스레드에서 발생하는 동기화 문제
예를 들어, 거대한 텍스트 파일을 읽고 그 정보를 텍스트 뷰에 표시하는 것을 생각해 봅시다.
- 스레드 시작
- 스레드에서 텍스트 파일을 읽습니다.
- 읽은 정보를 텍스트 뷰에 반영
안드로이드의 규칙상, 거대한 파일의 로드는 비 UI 스레드로 실시하지 않으면 안 됩니다.
즉, 상기 순서의 2번은 UI thread와는 다른 thread로 실시하게 됩니다.
그러나, 위의 순서의 3번(읽은 정보를 텍스트 뷰에 반영)은 UI thread로 실시하지 않으면 안 됩니다.
텍스트 파일의 로드는 다른 thread로 실시하고 있으므로, UI thread상에서는 언제 로드가 끝났는지 모릅니다.
즉, UI 스레드와 동기화할 수 없습니다.
어떻게 UI 스레드에 동기화하면 좋을까요?
Handler는 thread 간의 통신을 하는 구조
이것을 해결하는 것이 Handler와 Runnanle이라는 구조입니다.
Handler란 Looper에게 명령을 내기 위한 구조입니다.
명령은 특수 숫자나 기호 등이 아니라 Runnable이라는 인터페이스입니다.
Runnable은 Run이라는 메서드를 구현해야 합니다.
Handler는 Runnable을 Looper에 전달합니다.
Looper는 Handler로부터 Runnable을 받으면, 그것을 자신의 thread로 실행해 줍니다.
즉, 스스로 구현한 Run 메소드를 Looper상에서 실행해 주는 것입니다.
Looper(루퍼)에 관련해서는 하기 URL을 클릭해주시길 바랍니다.
[안드로이드]Looper의 목적은 무엇일까? 또 그 사용법은?
루퍼란 무엇일까? 루퍼는 큐에서 메시지(Runnables)를 실행하는 데 사용되는 클래스입니다. 일반 스레드에는 이러한 큐가 없습니다. 단순 스레드에는 큐가 없습니다. 일단 실행되고 메서드의 실행
seodev.tistory.com
Handler는 모든 스레드에서 사용할 수 있습니다.
Handler를 사용하여 비 UI 스레드에서 UI 스레드에 Runnable을 전달하면 비 UI 스레드에서도 UI 스레드를 처리할 수 있습니다.
이 메커니즘을 사용하면 텍스트 파일을 로드한 후 UI를 업데이트할 수 있습니다.
Handler 사용법
사용법은 간단합니다.
Handler와 Runnable의 인스턴스를 만들고 Handler#post라는 메서드로 설정하면 됩니다.
public void HandlerTest() {
Handler handler = new Handler();
Runnable runnable = new Runnable() {
@Override
public void run() {
}
};
handler.post( runnable );
}
이 경우 Handler.post를 실행하면 UI 스레드에서 run이 실행됩니다.
Runnable을 지연시켜 실행을 하고 싶을 때는, Habdler.postDelay를 사용합니다.
public void HandlerTest() {
Handler handler = new Handler();
Runnable runnable = new Runnable() {
@Override
public void run() {
}
};
handler.postDelayed( runnable, 1000 );
}
지연 시간은 밀리초입니다. 이 경우 1 초 후에 run이 UI 스레드에서 실행됩니다.
Runnable 메서드 내에서 반복적으로 postDelay를 실행하면 간단한 타이머가 될 수 있습니다.
꽤 편리합니다.
'개발 > 안드로이드 어플' 카테고리의 다른 글
안드로이드 개발 비동기 처리 "AsyncTask"의 기본 기초 (0) | 2022.12.16 |
---|---|
안드로이드 어플 개발 Context 이용 (0) | 2022.12.13 |
[안드로이드]Looper의 목적은 무엇일까? 또 그 사용법은? (2) | 2022.12.08 |
안드로이드 Activity수명주기 라이프사이클에 대해서 (2) | 2022.12.07 |
안드로이드 어플 화면 전환 시 파라메터 보내는 방법 Intent, putExtra (3) | 2022.12.07 |
댓글