안녕하세요, 반갑습니다!
오늘은 스레드(Thread) 포스팅에 이어 스레드를 사용하는 대표적인 앱을 하나 만들어보겠습니다.
Timer 는 간단하면서도 많은 앱에 쓰이고 있이는 기능이지요.
코틀린에서 제공하는 timer 를 통해 보다 쉽게 만들 수 있습니다.
쉬우니까 같이 한번 만들어 보시면 좋을 것 같습니다.
타이머(Timer)
구현하기
1. 화면 배치
역시 화면 구성부터 해야겠지요?
간단하게 스탑워치를 만들어봤습니다.
시작버튼과 정지버튼, 그리고 초기화 버튼을 배치했습니다.
2. 코틀린의 timer 스레드
Thread 를 상속받아 백그라운드에서 시간을 측정하는 방법도 있습니다만,
훨씬 간단한 코틀린에서 제공하는 Timer 를 이용하겠습니다.
타이머 앱의 기본 구조는 아래의 코드와 같습니다.
timer(period = 시간(마이크로초ms)) { //1000ms == 1초
//스레드로 동작할 작업
runOnUiThread {
//UI 에 반영
}
}
하지만, 그 전에 timer() 에 대해서 간략하게 설명하겠습니다.
코틀린에서 제공하는 timer()는 일정시간을 주기로 동작을 반복 수행하도록 하는 기능입니다.
'kotlin.concurrent.timer' 를 import 하지만, 자동으로 등록할 수 있으니 신경쓰지 않아도 됩니다.
이 timer() 는 괄호안에 파라미터를 넘겨줌으로써 작동되는데요.
아래 값들을 지정해줄 수 있습니다만,
- name : String - 함수를 실행하는데 필요한 스레드의 이름을 지정할 수 있습니다. (기본값 : Null)
- deamon : Boolean - 'true'일 경우 이 함수는 Deamon 스레드로 동작합니다. (기본값 : true)
- initialDelay : Long - 실행되기까지 지연시간을 지정할 수 있습니다(기본값: 0)
- period : Long - Thread.sleep() 처럼 실행 주기를 설정할 수 있습니다.(기본값: 없음, 필수)
period 를 제외하고는 지정해줄 필요는 없습니다.
period 만 설정해주셔도 됩니다.
3. 타이머 시작
가장 먼저 전역변수로 아래와 같이 선언해주세요
class MainActivity : AppCompatActivity() {
private var time = 0
private var timerTask : Timer? = null
override fun onCreate(savedInstanceState: Bundle?) {
.
.
.
}
}
그리고 시작 버튼에 ClickListenr 를 달아겠습니다.
btnStart 버튼을 누르면 타이머가 작동합니다.
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
.
.
.
btnStart.setOnClickListener {
startTimer() //타이머 작동
}
}
}
startTimer() 코드 입니다.
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
.
.
.
}
//타이머 작동
private fun startTimer() {
timerTask = timer(period = 10) {
time++
val sec = time / 100
val milli = time % 100
runOnUiThread {
txtTime?.text = "${sec} : ${milli}"
}
}
}
}
4. 타이머 정지
정지 버튼인 btnStop 에 ClickListener를 달아줍니다.
btnStop 버튼을 누르면 타이머가 정지합니다.
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
.
.
.
btnStop.setOnClickListener {
stopTimer() //타이머 정지
}
}
}
stopTimer() 코드 입니다.
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
.
.
.
}
//타이머 정지
private fun stopTimer() {
timerTask?.cancel()
}
}
5. 타이머 초기화
정지 버튼인 btnInit 에 ClickListener를 달아줍니다.
btnInit 버튼을 누르면 타이머가 처음의 상태로 초기화 됩니다.
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
.
.
.
btnInit.setOnClickListener {
resetTimer() //타이머 초기화
}
}
}
restTimer() 코드 입니다.
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
.
.
.
}
//타이머 초기화
private fun resetTimer() {
timerTask?.cancel()
time = 0
txtTime?.text = "00:00"
}
}
감사합니다.