상상하라 그리고 현실로 만들어라.

상상하는 모든 것이 미래다.

Kotlin과 Android/Android

코틀린으로 안드로이드 타이머 앱 구현하기

월터제이(Walter J) 2020. 12. 2. 09:00

안녕하세요, 반갑습니다!

 

오늘은 스레드(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"
    }
}

 

 

 

감사합니다.

반응형