[Android] 쓰레드와 핸들러
메인액티비티는 화면을 가지고, 이벤트가 발생했을 때 처리해 주는 역할을 수행한다.
메인액티비티에는 메인 쓰레드가 만들어져 있고, 이벤트가 발생해 이벤트 큐에 저장된 이벤트들을 메인쓰레드가 하나씩 실행시킨다. (메인액티비티에는 하나의 프로세스가 있고, 프로세스 안에 쓰레드가 있다.)
메인 이벤트가 한 가지 일을 처리하고 있을 때, 그 일처리가 끝나기 전에는 다른 동작을 할 수 없다.
예를 들면, 버튼을 눌렀을 때 용량이 큰 파일 하나를 다운받는 프로그램을 만들었다고 하자. 이 때 파일의 다운로드가 끝나기 전까지 화면의 어떤 버튼을 눌러도 화면이 바뀌지 않고 멈춘 상태를 유지한다.
이 때 쓰레드를 하나 더 만들어 위 상황을 해결할 수 있다.
메인 쓰레드가 하는 일을 별도로 쓰레드를 만들고 그 쓰레드에게 지정해 줄 수 있다. (멀티쓰레드)
이 때 새로 만든 쓰레드는 이벤트 처리 결과를 화면에 있는 위젯들을 직접 변경할 수 없어 핸들러에게 요청하고 이벤트 처리 결과를 전달한다.
안드로이드는 자바 기반이기 때문에 안드로이드에서 사용하는 쓰레드의 개념은 자바의 쓰레드 개념과 동일하다고 생각할 수 있다.
쓰레드의 선언 방법도 비슷하고, 자바에서의 쓰레드를 잘 이해하고 있으면 쓰레드의 장단점을 쉽게 이해할 수 있다.
백그라운드 작업을 수행할 때 서비스를 이용할 수 있고 쓰레드를 이용할 수 있다.
서비스로 작업을 수행할 경우 작업이 끝나면 알림 서비스를 통해 사용자에게 작업이 끝났음을 알려주거나 브로드캐스팅을 통해 결과값을 전달할 수 있다. (Intent를 통해 정보를 주고받는다.)
메인 쓰레드 내에 쓰레드를 하나 만들어 작업을 수행할 경우, 쓰레드들은 동일 프로세스 내에 있기 때문에 Intent를 사용하지 않아도 된다. 하지만, UI객체에 직접 접근할 수는 없으므로 핸들러 객체를 사용한다.
쓰레드의 일처리과정을 이해하기 위해 우선 핸들러에 대해 알아보자.
쓰레드는 별다른 지시가 없으면 큐에 담긴 동작들을 순차적으로 수행한다. 하지만 핸들러를 이용하면 특정 동작을 미래의 어떤 시점에 실행되도록 스케줄링 해 줄 수 있다.
코드를 통해 알아보자.
코드 내의 textView 부분에 집중하자.
이전까지의 코드는 Logcat화면에 띄우게 함으로써 화면에는 영향을 주지 않는다.
textView의 setText를 통해 value값을 바꾸려 하면 오류가 발생한다.
쓰레드는 바로 화면에 접근할 수 없고, 핸들러를 통해서 UI에 접근해야 한다.
1. 핸들러 객체를 생성하고 obtainMessage 메서드를 통해 쓰레드에게 메세지 객체를 전달한다.
2. 전달한 메세지 객체를 쓰레드가 채우고 sendMessage 메서드를 통해 다시 핸들러에게 전달한다.
3. 메세지 큐에 있는 메세지 객체가 자기 차례가 되면 handleMessage 메서드를 통해 메서드의 내용을 실행한다.
()
이런 과정을 통해 새로 만든 쓰레드가 화면에 접근한다.
Handler 클래스를 상속받아 나만의 핸들러 클래스를 만든다.
이 때 handleMessage 메서드를 오버라이딩해 메서드의 내용을 재정의한다.
이후 메인액티비티의 onCreate 메서드에서 핸들러 객체 생성 코드를 추가해야 한다.
오류가 발생했던 코드를 핸들러를 통해 오류를 제거한 코드이다.
쓰레드를 구현하는 방법에는 두 가지가 있다.
Runnable 인터페이스를 통해서도 쓰레드를 구현할 수 있었는데, 안드로이드에서도 Runnable 인터페이스를 활용해 쓰레드를 구현할 수 있다.
Runnable 객체를 기존에 있는 핸들러 클래스의 post() 메서드를 이용해 전달해주는 방식으로 쓰레드를 구현할 수 있다.
이렇게 구현하면 핸들러 객체를 따로 만들지 않고 쓰레드를 구현할 수 있다.
post 메서드의 매개변수는 Runnable 객체이다. Runnable을 매개변수 입력부분 안에서 구현하자.
핸들러를 통해 일정시간 후에 동작이 실행되도록 코드를 작성할 수 있다.
handler 클래스의 postDealyed 메서드를 구현해 일정시간 후에 동작하도록 만들었다.
위의 경우엔 Runnable 객체를 이용해 구현했는데, 핸들러 객체를 새로 생성해서 같은 동작을 하는 코드를 작성할 수도 있다.
스레드를 활용해 간단한 애니메이션을 만들 수 있다.
지금까지 배운 내용을 활용하면 충분히 만들 수 있으므로 코드로 바로 확인하자.
(제네릭스를 이용해 drawable 타입의 Arraylist를 선언했고, 필요한 사진을 저장하는 작업은 이미 끝마친 상황이다.)
'Mobile > Android' 카테고리의 다른 글
[Android] 음악 재생 플레이어 만들기 (0) | 2021.11.21 |
---|---|
[Android] 리스트 보여주기 (0) | 2021.11.21 |
[Android] 서비스와 브로드캐스트 수신자 (0) | 2021.11.06 |
[Android] 인텐트와 프로그레스바 사용하기 (0) | 2021.10.28 |
[Android] 여러 화면 간 전환 (0) | 2021.10.25 |
댓글
이 글 공유하기
다른 글
-
[Android] 음악 재생 플레이어 만들기
[Android] 음악 재생 플레이어 만들기
2021.11.21 -
[Android] 리스트 보여주기
[Android] 리스트 보여주기
2021.11.21 -
[Android] 서비스와 브로드캐스트 수신자
[Android] 서비스와 브로드캐스트 수신자
2021.11.06 -
[Android] 인텐트와 프로그레스바 사용하기
[Android] 인텐트와 프로그레스바 사용하기
2021.10.28