Timer
코틀린에서 기본으로 제공하는 timer()는 일정 시간을 주기로 동작을 반복 수행하도록 지원합니다.
timer()의 파라미터는 다음과 같습니다.
- name: String? - 함수를 실행하는데 필요한 스레드의 이름 지정 (기본값 : null)
- daemon: Boolean - true일 경우 Daemon 스레드로 동작 (기본값 : true)
- initialDelay: Long - 실행되기까지의 지연시간 지정 (기본값 : 0, 단위는 1000분의 1초)
- period: Long - Thread.sleep()처럼 실행주기 설정 (필수로 설정, 단위는 1000분의 1초)
timerTask = timer(initialDelay = 1000, period = 100) {
// 오래 걸리는 작업 수행부분
runOnUiThread {
// UI 관련 작업은 Main Thread에서만 수행
}
binding.root.post {
// 해당 handler와 연결된 thread에 전달할 runnable 객체 작성
}
}
// timerTask가 null이 아니면 cancel() 호출
timerTask?.cancel()
위의 코드에 따르면 1초 뒤에 0.1초 단위로 타이머를 실행하고 cancel()을 통해서 타이머를 정지합니다.
또한, 작업 스레드와 UI 스레드가 분리되어 있는데 다른 스레드에서 UI를 업데이트할 수 없기 때문입니다.
이 문제를 해결하기 위해 Android는 다른 스레드에서 UI 스레드에 액세스하는 여러 가지 방식을 제공합니다.
다음은 몇 가지 유용한 메서드 목록입니다.
Thread
안드로이드는 기본적으로 Main Thread (UI Thread) 하나만으로 구성되는 Single Thread Model로써 동작합니다.
Single Thread Model의 2가지 원칙에는 Main Thread를 block하지 않는 것과 UI 작업은 Main Thread에서만 접근할 수 있다는 것이 있습니다. 멀티 스레드 환경에서 Main Thread와 Worker Thread가 동시에 UI를 접근하면 실제로 적용할 UI에 대해서 혼동이 생길 수 있기 때문입니다.
결국, Worker Thread를 생성하여 작업을 하는 궁극적인 이유는 장시간이 소요되는 작업을 Worker Thread에서 수행 후 해당 결과를 기반으로 Main Thread에서 UI에 변화를 주기 위해서입니다.
그렇지만, Main Thread에서만 UI를 조작할 수 있다면 매우 비효율적이기 때문에 Thread에 Handler와 Looper를 두어 스레드 간 Runnable, Message 객체를 주고받을 수 있게 하여 Worker Thread에서도 Main Thread의 Handler를 통해 UI 작업을 수행할 수 있습니다.
'안드로이드 > 개념' 카테고리의 다른 글
[Android] registerForActivityResult 사용하기 (0) | 2023.07.26 |
---|---|
[Android] Serializable vs Parcelable (0) | 2023.07.21 |
[Android] 명시적 인텐트와 암시적 인텐트 (0) | 2023.07.16 |
[Android] Activity 상태 변경 처리 (0) | 2023.07.16 |
[Android] Android의 이해 (0) | 2023.07.15 |