본문 바로가기
어플 개발

안드로이드 스튜디오 타이머 및 delay 함수 사용 방법

by MinervaG 2020. 4. 11.

앱을 만들기 위해 다양한 코드를 배우는 시점에서 가장 기본적인 타이머 기능에 대해 보통 공부를 시작합니다. 하지만 의외로 타이머 기능을 구현하는 코드가 잘 없어서 고생을 많이 했는데요. 타이머는 chronometer를 이용하면 특정 시간을 카운트 다운하거나 아니면 시간을 증가시켜 카운트 업 하는 타이머를 구현할 수 있습니다. 해당 코드는 의외로 많이 있었기 때문에, 그것 이외의 것을 해당 포스트에서 공유하고자 합니다. 공유하고자 하는 내용은 지연 즉 딜레이(delay)를 주는 방법에 대해서 작성하려고 합니다. 3가지 타입에 대해서 delay를 주는 방법에 대해 작성하겠습니다.

첫 번째로 Handler postDelayed()함수를 이용한 방법입니다. 코드는 아래와 같습니다.

 

override fun onCreate(savedInstanceState: Bundle?) {

super.onCreate(savedInstanceState)

setContentView(R.layout.activity_main)

Handler().postDelayed({

imageView1.visibility=View.INVISIBLE

}, 3000L)

Handler().postDelayed({

imageView1.visibility=View.VISIBLE

}, 4000L)

}

 

imageView1에 대해서 기존 포스팅에서 언급했던 이미지를 숨기거나 나타나게 하는 코드를 함께 이용하였습니다. 3000L3s입니다. 3초가 지났을 때 imageView1이 숨겨지도록 코딩을 한 모습입니다. 즉 Handler().posteDelayed({ 이 괄호 안에 있는 내용이 delay 되어 발생하라는 뜻이며, 이후 3000L3s delay후 진행하라는 지연 시간을 의미하고 있습니다. 그리고 이어서 초록색으로 칠한 4s뒤 다시 imageview1이 나타나도록 코딩을 한 모습입니다.

 

일반적인 for문이나 while문을 고려했을 때 해당 loop가 전부 진행되고 끝났을 때 다음 아래에 있는 코드로 실행이 넘어갑니다. 하지만 위처럼 코딩을 할 경우 노란색 3s 딜레이 후 imageView1이 나타나고, 그리고 또 4s뒤 즉 총시간으로 보아 7s뒤에 이미지가 다시 나타나겠지 라고 생각하면 안 됩니다. 코틀린에서는 각각의 코드를 바로 실행하고 delay만 추후 발생하도록 되어 있습니다. 따라서 위의 코딩 결과는 3simageView1가 숨겨져서 안 보이고, 1s(4s 지남) imageView1이 다시 나타나게 됩니다. 즉 이미지가 숨겨졌다가 나타나는데 걸린 총시간은 4s입니다. 7simageView1이 나타나려면 해당 코드를 어떻게 바꾸어야 할까요?

 

두 번째로 Timer()Schedule()을 이용한 delay입니다. 아래 코드를 보겠습니다.

Timer().schedule(5000){

imageView1.visibility=View.INVISIBLE

}

 

특별한 함수 선언 없이 Timer().schedule()을 import만 하면 됩니다. 대소문자를 구분하기 때문에 정확히 보셔야 합니다. 그리고 schedule(5000)괄호 안의 50005s를 뜻합니다. 1s를 원하시면 1000을 쓰면 되겠네요. 그리고 이후 {} 괄호 안의 값이 5s delay imageView1이 나타나도록 실행을 시킨 모습입니다. Handler().postDelayed()함수와 거의 동일하며 차이는 delay 시키고자 하는 시간의 표기를 앞에 쓰냐 뒤에 쓰냐의 차이만 있을 뿐 크게 차이가 없다고 생각하시면 될 것 같습니다.

 

위 두 함수는 사용자가 혹은 개발자가 정확한 타이밍을 눈으로 보면서 체크를 할 수 없다는 단점이 있습니다. 또한 사용자에게 10s남았으니 서둘러!와 같은 경고를 주고 싶으면 10s가 남았는지 9s가 남았는지 보여 줄 필요가 있습니다. Chronometer를 이용하여 시계를 보여줘도 괜찮지만 txt로 간단하게 해당 내용을 보여줄 수 있습니다. 바로 CountDownTimer() 함수를 사용하면 간단하게 해결할 수 있습니다. 아래 코드를 보겠습니다.

 

object : CountDownTimer(10000, 1000) {

override fun onFinish() {

timertxt.text = "End"

handler.removeCallbacks(runnable)

}

override fun onTick(p0: Long) {

timertxt.text = "Time :" + p0 / 1000

}

}.start()

 

CountDownTimer()괄호 안에 있는 숫자는 total time과 몇 초로 쪼개서 카운트할 것인가를 나타내는 값입니다. 위의 예제에서는 10000, 1000가 표기되어 있습니다. 10s1s로 쪼개서 카운트하겠다는 것을 의미합니다. 여기서 timertxtlayout파일에서 text를 넣어 IDtimertxt로 설정하였으며, 여기에 타이머가 나오도록 하였습니다. onFinish()onTick()은 단어 그대로의 역할을 수행합니다. 주어진 시간이 모두 소진되었을 때 onFinish()에 해당하는 명령어를 수행합니다. onTick()은 시간이 위에 쪼개진 타이밍에 맞춰 수행할 명령을 넣은 것입니다. 현재 흘러가는 시간을 표기해야 하기 대문에 onTick에서 표기를 하였고, p0로 받은 값을 1000으로 나누어 시간을 text layout에 표기하는 형태로 코딩을 하였습니다. onFinish에 원하는 작업을 입력하여 원하는 작업을 수행할 수 있습니다.

 

Delay를 주는 3가지 방법에 대해서 공유했습니다. 각각이 가지는 특징이 있기 때문에 상황에 맞게 해당 코드를 잘 이용하면 좋을 것 같습니다.

반응형

댓글


TOP