안드로이드(Android) 개발 Timer 구현하는 방법

안드로이드 개발

안드로이드(Android) 개발 Timer 구현하는 방법

 

환경: Eclipse Mars, Android 4.2.2

 

안드로이드에서 타이머 기능은 써 먹을 곳이 많습니다. 일정시간 이후 넘어가는 Intro 화면이나 정해진 간격으로 반복작업이 필요한 곳에 많이 사용합니다. 구현 방법은 두 가지 정도가 있습니다. 첫 번째는 안드로이드 SDK 에서 제공하는 스케줄용 Timer TimerTask 를 이용하는 것입니다. 두 번째는 스레드 클래스나 인터페이스를 이용하는데, Sleep 을 이용해서 간격을 유지합니다. 저는 첫 번째 방법을 주로 사용합니다. 가독성과 구현이 쉽기 때문입니다.

 

첫 번째 방법인 스케줄용 클래스인 Timer TimerTask 이용하는 방법입니다. 그림처럼 TextView 화면에 현재 시간을 표시하는 기능을 구현할 것입니다.

안드로이드(Android) 개발 Timer 구현하는 방법

 

메인 클래스는 Timer 입니다. Timer 객체를 생성하고 반복 수행할 간격을 세팅합니다. 그리고 작업할 내용은 TimerTask 클래스를 만들어서 run() 함수에 추가합니다. Activity 가 종료되는 시점인 onDestory() 에서 Timer 를 종료해야 합니다. 실행함수는 mTimer.cancel() 입니다

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

public class TimerActivity extends AppCompatActivity {

    private Timer mTimer;
    private TextView mTvTimer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_timer);

        mTvTimer = (TextView) findViewById(R.id.tv_timer);

        // 타이머 세팅
        mTimer = new Timer();
        //mTimer.schedule(new CustomTimer(), 1000); // 한번 실행
        mTimer.schedule(new CustomTimer(), 2000, 1000);
    }

    @Override
    protected void onDestroy() {
        mTimer.cancel();
        super.onDestroy();
    }

    // 첫 번째 TimerTask 를 이용한 방법
    class CustomTimer extends TimerTask{
        @Override
        public void run() {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd mm:ss");
            String currentTime = sdf.format(new Date());

            mTvTimer.setText("Timer Class 현재 시간 : " + currentTime);
        }
    }
}

 

다음은 Timer 클래스에 schedule() 함수의 종류와 설명입니다.

 

schedule(TimerTask task, long delay)

작업을 일정한 시간 이후에 실행한다. 지연 시간은 두 번째 인수인 delay . 

 

schedule(TimerTask task, long delay, long period)

작업을 일정한 시간 delay 이후에 실행하며, period 간격마다 작업을 반복한다. 

 

schedule(TimerTask task, Date time)

정해진 시간에 실행한다. 두 번째 인수인 time 이 실행시간이다.

 

schedule(TimerTask task, Date firstTime, long period)

정해진 시간인 firstTime 에 실행하고, period 간격마다 작업을 반복한다.

안드로이드(Android) 개발 Timer 구현하는 방법

 

두 번째는 Runnable 인터페이스 클래스를 상속받아 스레드 클래스를 만듭니다. 그리고 run() 함수안에 Thread.sleep() 를 줘서 일정 시간 반복하도록 합니다. 

import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.TextView;

import java.text.SimpleDateFormat;
import java.util.Date;

public class TimerActivity extends AppCompatActivity {

    private Handler mHandler;
    private CustomRunnable mCustomRunnable;
    private TextView mTvTimer;
    private String mCurrentTime;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_timer);

        mTvTimer = (TextView) findViewById(R.id.tv_timer);

        mCustomRunnable = new CustomRunnable();
        mHandler = new Handler();
        mHandler.postDelayed(mCustomRunnable, 1000);
    }

    @Override
    protected void onDestroy() {
        mHandler.removeCallbacks(mCustomRunnable);
        super.onDestroy();
    }

    class CustomRunnable implements Runnable{
        @Override
        public void run() {
            try {
                while(true){
                    Thread.sleep(1000);

                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd mm:ss");
                    mCurrentTime = sdf.format(new Date());

                    Log.d("Timer", mCurrentTime);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

}


구현한 결과는 다음과 같습니다

안드로이드(Android) 개발 Timer 구현하는 방법


Posted by 녹두장군