상세 컨텐츠

본문 제목

[android/kotlin]handler를 사용한 stopwatch구현

안드로이드

by bydawn25 2021. 3. 14. 13:08

본문

handler 공식문서

 

JVM(java virtual machine)은 thread를 통해 queue에 있는 여러개의 task를 실행하게 된다. thread를 잘 사용하면 앱의 성능을 효율적으로 상승시킬 수 있다.(공식문서)

 

이때 thread에 원하는 task를 할당시킬 수 있는 function이 handler이다. task를 queue에 넣었다 빼면서 원하는 기능을 수행할 수 있도록 돕는다.

 

이 포스트에서는 handler의 기초 function을 활용하여 stopwatch를 구현해 보도록 하겠다. handler를 사용한 stopwatch의 로직은 stopwatch task를 정의하여 thread message queue에 넣어 수행되도록 하는것이다. 그렇기 위해서는 stopwatch task인 handler task를 정의하여햐 한다.

 

 

 

handler, handlerTask선언

var handler = Handler(Looper.getMainLooper());

handlerTask = 
	object : Runnable {
            override fun run() {
                second++
                timerContent.text =  timerFuncs.secondToStopwatchText(second)
                handler.postDelayed(this, 1000)
            }
        }

handler를 Looper없이 선언할 수 있었으나 최근 depcreted되었다. 내가 원하는 작업은 main thread를 사용하고 싶으므로 Looper를 통해 main thread를 사용할 수 있도록 선언해 준다.

 

handler를 사용하기 위해서 객체는 runnable로 선언되어야 한다. 6~8번째 줄을 보면 1초마다 second 변수를 증가시키고 이를 이용해 stopwatch 형태로 출력하여 view에 변화를 주는 방식을 선택했다.

 

여기서 1초마다 어떻게 second를 증가시키나요? 라는 질문을 할 수 있는데 그 기능은 handler의 postDelayed를 사용하면 된다. postDelayed는 원하는 runnable task를 원하는 시간만큼 지연시켜 실행할 수 있게 해준다. 이 기능을 이용하면 사용자가 특정한 행동을 30초 동안 하지 않았을때 종료 여부를 체크한다거나 하는 기능을 구현할 수 있을것 같다.

 

여기서는 1000 millisecond로 delay를 줘 적절한 타이밍마다 초를 세주는 역활을 부여했다.

 

이렇게 handlerTask를 선언하고 postDelayed를 사용하면 한번만 이 function이 진행된다. 계속해서 thread에서 돌아갔으면 좋겠으면 어떻게 하느냐? 그럼 post를 사용하면 된다.

 

 

 

 

 

task를 실행, 정지, 멈추기

if(state==TimerState.start)
	handler.post(handlerTask)
else {
	handler.removeCallbacks(handlerTask)
	if(state==TimerState.stop) {
		second=0
	}
}

2번째 줄은 시작, 4번째줄은 잠시 멈춤, 5~6번째 줄은 초기화하는 코드다. handler task를 queue에 자유롭게 때었다 붙였다 한다고 생각하면 좋다.

 

시작할때는 post를 이용하여 붙이고 끝낼때는 removeCallbacks를 사용하여 제거한다. 다만 멈추는 기능은 지금까지 진행한 second를 초기화 할 필요 없으므로 (second는 지금 편의상 global로 선언해 두었다) 초기화 하지 않고 완전종료하는 상태라면 second=0으로 초기화 한다.

 

*global variable은 보안상 이유로 선호하지 않는다. 귀찮더라도 function을 통해 넘기거나 class로 사용하려고 하는 편이다.

 

 

 

 

이렇게 하면 간단한 stopwatch구현이 마무리 된다. handler를 간단히 사용해 볼 수 있었다.

'안드로이드' 카테고리의 다른 글

[Xamarin/쟈마린] TabLayout  (0) 2021.01.03

관련글 더보기