안드로이드 프로그램에서 필수적으로 사용되는 Handler란 무엇인지에 대해 정리하겠습니다.
핸들러에 알기 위해서는 먼저 스레드와 함께 생각을 해 보아야 합니다.
스레드는 하나의 프로세스 안에서 동시에 수행되어야 하는 작업을 위해 사용합니다.
자바에서 스레드를 학습해본 분이라면 접근이 더 쉬울 텐데요.
그 이유는 안드로이드 시스템의 스레드는 자바의 스레드 개념을 그대로 사용하기 때문입니다.
하지만 안드로이드 시스템에서 프로그램을 작성하는 개발자가 생성한 스레드는
UI 변경 등의 행동을 할 수가 없습니다.
그 이유는 UI를 관리하는 메인 스레드와 동시에 접근할 때 발생할 수 있는 문제를
사전에 방지하기 위해서 안드로이드 시스템에서 만들어놓은 안전기능입니다.
이러한 UI접근 등을 핸들러를 통해서는 가능하기 때문에 스레드와 핸들러를 적절히
혼합해서 사용하면 이러한 문제에 직면할 일은 없습니다.
개발을 하면서 핸들러를 사용하지만 명확하게 정의된 의미는 없습니다.
1) Handler란?
자 그렇다면 정의된 의미가 없는 핸들러에 대해 조금이나마 이해해 보도록 하겠습니다.
안드로이드는 새로운 프로젝트를 만들면 자동으로 생성되는 MainActivity는 Application이
실행될 때 하나의 프로세스에서 처리하게 됩니다.
따라서 MainActivity 내에서 이벤트를 처리하거나 특정 메서드를 정의하여 기능을 구현할 때에도
같은 프로세스 안에서 실행됩니다.
같은 프로세스 안에서 일련의 기능이 순서대로 실행될 때에는 대부분 큰 문제가 없겠지만
대기 시간이 길어지는 네트워크 요청 등의 기능을 수행할 때에는 화면에 보이는
UI도 멈춰있기 때문에 Application이 멈춘 것과 같은 문제가 생깁니다.
이러한 문제를 해결하기 위해서 하나의 프로세스 안에서 여러 개의 작업이 동시 다발적으로
수행되는 멀티 스레드 방식을 사용해야 합니다.
스레드는 동시 수행이 가능한 작업 단위이며 현재 수행 중인 작업 이외의 기능을
동시에 처리할 때 새로운 스레드를 만들어서 처리하게 됩니다.
이러한 멀티 스레드 방식은 같은 프로세스 안에 들어 있으면서 메모리 리소스를 공유하므로
효율적인 처리가 가능하지만 동시에 리소스에 접근할 때 데드락이 발생할 가능성이 있어서
시스템이 비정상적으로 동작하거나 에러가 발생할 수 있습니다.
이러한 문제를 해결하기 위해 핸들러를 사용하여 메인 스레드에 작업을 요청하면
메인 스레드는 작업이 전달된 순서대로 처리를 해 주기 때문에 데드락 등의 문제가 발생하지 않습니다.
2) Handler Message
앱이 실행할 때 프로세스가 만들어지면 그 안에 메인 스레드가 함께 생성됩니다.
그리고 최상위에서 관리되는 앱 구성 요소인 액티비티, 브로드캐스트 수신자 등과 새로 만들어지는
윈도를 관리하기 위한 메시지 큐를 실행합니다.
메세지 큐를 사용하면 순차적으로 코드를 수행할 수 있는데, 이렇게 메세지 큐로 메인 스레드에서
처리할 메시지를 전달하는 역할을 핸들러 클래스가 담당하게 됩니다.
결국 핸들러는 실행하려는 특정 기능이 있을 때 핸들러가 포함되어 있는 스레드에서 순차적으로
실행시킬 때 사용하게 되는 것입니다.
핸들러 함수에서 지원하는 Delay를 사용하면 개발자는 핸들러가
특정 시점에 또는 몇 초 뒤의 실행 등이 가능합니다.
3) Handler 코드
먼저 핸들러를 간단하게 실행하는 방법으로는 handleMessge를 사용하는 것입니다.
Handler TestHandle = new Handler();
핸들러 객체를 하나 만들어 준 뒤에 TestHandle내부에 handleMessage 함수를 Override 합니다.
이렇게 만든 Handler를 사용할 때에는 비교적 간단합니다.
바로 호출하고자 하는 경우에는
TestHandle.sendEmptyMessage(0);
만약 호출하고자 하는 시점이 1초 뒤라고 한다면
TestHandle.sendEmptyMessageDelayed(0,1000);
이 두 가지 방식을 통해 쉽게 적용할 수 있습니다.
'안드로이드' 카테고리의 다른 글
[Android] 백그라운드 제약 (0) | 2021.11.01 |
---|---|
[Android] 데이터 저장 SharedPreferences (0) | 2021.10.20 |
[Android] Foreground (0) | 2021.10.11 |
[Android] NFC란? (0) | 2021.10.08 |
[Android] Http 통신 (0) | 2021.10.07 |
댓글