관리 메뉴

드럼치는 프로그래머

[안드로이드] 안드로이드에서 타이머 구현 하기 본문

★─Programing/☆─Android

[안드로이드] 안드로이드에서 타이머 구현 하기

드럼치는한동이 2012. 3. 16. 15:14

안드로이드에서 타이머 구현 하기

 

개발환경 : JDK 1.6, Android 2.1, window XP

 

이번에는 안드로이드에서 타이머 구현 방법에 대해 언급할려고 한다.

쓰임세는 다양하다. 게임에서 시계표시를 할수 있고 타이머 관련

구현도 가능하며 시간 간격에 맞게 어떤 작업을 수행하고자

할때도 쓰일것이다. 그래서 한번은 정리할 필요가 있었다.

 

(1) java 에서 주로 쓰는 방법

 

안드로이드는 java를 기반으로 하기 때문에 java 에서 사용하는

타이머 구현 방법을 떠올릴 것이다.

Java 에서 구현하는 방법은 여러가지가 있는데 그 첫번째는

스레드를 이용하는 것이다.

추상클래스인 Runnable 를 상속받던지 아니면 Thread 클래스를

생성해서 run 함수를 구현하는데 그 속에 일정한 간격으로

루프를 돌수 있도록 구현 하면 된다.

 

private final class SwapViews implements Runnable {

    private final int mPosition;

 

    public SwapViews(int position) {

        mPosition = position;

    }

 

    public void run() {

        // 기능구현

          

           Thread.sleep(1000);// 1초의 정지

    }

}

 

// 위 클래스 사용

SwapViews swapViews = new SwapView(0);

swapViews.start();

 

두번째는 Timer 를 이용하는 방법이다.

Timer 클래스는 시간관리를 위해 만들어진 클래스 이므로

이것이 타이머 관리를 위해 더 적절한 방법일지도 모르겠다.

그리고 구현하기도 쉽다. 파라미터로 몇 개의 값만 넘기면

되기 때문이다.

예제를 보게 되면 첫번쨰 파라미터는 작업을 수행할 TimerTask

클래스 객체를 만들어 넣으면 된다. 그속에 run 함수는 필수로

구현 해야되며 run 에 있는 내용이 설정한 시간 간격에 맞게

수행이 되는것이다.

그리고 두번쨰는 run 이 실행되고 종료 시간을 나타낸다.

두번째 파라미터만 넣게 되면 한번으로 끝나지만 세번째 파라미터를

넣게 되면 넣은 값만큼의 간격으로 반복하게 되는것이다.

 

TimerTask task = new TimerTask(){

public void run() {

           try {

              mainTime++;

              int min = mainTime / 60;

              int sec = mainTime % 60;

              String strTime = String.format("%s : %s", min, sec);

          

              //Thread.sleep(1000);

           } catch (Exception e) {

              e.printStackTrace();

           }

}

};

Timer mTimer = new Timer();

mTimer.schedule(task, 1000, 1000);

// 3초후 run을 실행하고 종료 timer.schedule(task, 3000);

// 10초후 run을 실행하고 매3초마다 실행 timer.schedule(task, 10000, 3000);

 

(2) android 에서 Handler 을 이용한 방법

 

위의 두가지 방법은 java 에서 흔히 구현하는 방법이고 안드로이드에서는

또 다른 방법이있다. 굳이 그 방법을 소개 할려는 것은 위의 방법으로는

내부적으로 수행하는 기능은 구현할지 모르겠지만 화면상에 실시간으로

시간값을 변경해야 한다던지 시계가 움직이는 애니메이션 같은 것을

구현하고자 한다면 아래에 소개한 방법으로 해야 되기 때문이다.

그것은 android.os.Handler 클래스를 이용하는 것인데 백그라운드

메시지를 전달할때도 쓰이는데 이것을 sendEmptyMessageDelayed  함수를

이용해 일정한 간격으로 계속 반복해서 보냄으로서 시계역활을 할수 있게 된다.


구현은 android.os.Handler 클래스 객체를 정의한다.

그리고 필수 함수인 handleMessage 를 구현한다. handlerMessage 함수내부에는

sendEmptyMessageDelayed 함수를 실행해야 한다. 그래야 반복적으로

수행이 될것이다. 이 함수의 두번째 파라미터로 시간이 들어가게 되는데

반복하고자 하는 시간을 넣으면 된다.

 

mHandler = new Handler(){

   public void handleMessage(Message msg){

           super.handleMessage(msg);

          

           /** 초시간을 잰다 */

           int div = msg.what;

                    

           int min = mainTime / 60;

           int sec = mainTime % 60;

           String strTime = String.format("%02d : %02d", min, sec);

                    

 

           this.sendEmptyMessageDelayed(0, 1000);

           mTimeView.setText(strTime);

           mTimeView.invalidate();

           mainTime++;

          

   }

};

 

이렇게 정의를 했으니 이것을 사용해야 하는데 처음 시작하고자 하는 곳에

mHandler.sendEmptyMessage(1); 함수를 실행하면 된다. 파라미터로 넘어가는

1 의 값은 핸들의 구분자이다. 여러 개의 기능을 사용하고자 할 때 파라미터

값을 바꾸고 handleMessage 로 넘어온 Message what 변수로 구분하게 된다.

위의 int div = msg.what sendEmptyMessage 의 파라미터로 넘어간 값을

가져오게 되는 것이다.


[출처] http://mainia.tistory.com/603

Comments