App에서 주기적이며 반복적인 작업이 필요한 경우가 있습니다.  화면을 주기적으로 갱신 하던가 서버와 데이터를 일정시간마다 반복적으로 보내고 받아야 하는 경우등에는 Timer를 사용하는것이 소스가 간단해서 무척 편합니다.  한가지 단점은 중지 시켰다 다시 시작하는 기능이 없기 때문에 만일 화면에서 버튼으로 제어 하려면 제어를 한다기 보다는 Timer를 매번 새로 생성을 해야 합니다. 두가지 경우를 샘플을 만들어 테스트 해보겠습니다

.

 

1. 타이머 생성 및 종료

 

먼저 타이머를 사용하기 위해 Activity에 선언을 합니다.

 

private Timer timerCall;
private int nCnt;

 

그리고 반복적으로 사용할 TimerTaskonCreate()에 생성합니다.

생성된 TimerTask Timer3초에 한번씩 호출 하도록 schedule 합니다.

 

TimerTask timerTask = new TimerTask() {
   
@Override
   
public void run() {
        someWork();
    }

);

nCnt = 0;

timerCall = new Timer();
timerCall.schedule(timerTask,0,3000);

 

3초에 한번씩 someWork()을 호출 하는 함수는 단순 로그 출력 입니다.

 

private void someWork() {

    Log.d("Test==>", nCnt + " work!!!");
   
if(nCnt >= 10) {
        timerCall.cancel();
    }


    nCnt++;
}

 

앱이 종료 할때까지 타이머가 작동하며 잘 출력 됩니다.

 

D/Test==>: 1 work!!!
D/Test==>: 2 work!!!
D/Test==>: 3 work!!!
D/Test==>: 4 work!!!
D/Test==>: 5 work!!!
D/Test==>: 6 work!!!
D/Test==>: 7 work!!!
D/Test==>: 8 work!!!
D/Test==>: 9 work!!!
D/Test==>: 10 work!!!

 

전체 소스

 

package copycoding.tistory.timertest;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.view.View;

import java.util.Timer;
import java.util.TimerTask;

public class MainActivity extends AppCompatActivity {

   
private Timer timerCall;
   
private int nCnt;

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

       
nCnt = 0;

        TimerTask timerTask = new TimerTask() {
           
@Override
           
public void run() {
                someWork();
            }
        };

       
timerCall = new Timer();
       
timerCall.schedule(timerTask,0,1000);
    }

   
private void someWork() {

        Log.d(
"Test==>", nCnt + " work!!!");
       
if(nCnt >= 10) {
           
timerCall.cancel();
        }

       
nCnt++;
    }
}

 

 

2. 타이머 버튼 제어

 

이번에는 타이머를 버튼으로 제어를 해봅니다.   먼저 선언을 하고

 

private Timer timerCall;
private int nCnt;
TimerTask
timerTask;

 

onCreate()에 초기 값을 생성합니다.

 

nCnt = 0;

timerCall = new Timer();

 

start button을 클릭 하면 기존에 TimerTask가 있다면 삭제하고 다시 생성을 하여 타이머를 가동시켜주면 됩니다.

 

public void btnStart(View view) {
    Log.d(
"BTN Start==>", nCnt + " work!!!");
   
if(timerTask != null) {
       
timerTask.cancel();
    }
   
timerTask = new TimerTask() {
       
@Override
       
public void run() {
            someWork();
        }
    };
   
timerCall.schedule(timerTask,0,3000);
}

 

TimerTask를 삭제하지 않고 계속 생성 하면 기존 타이머가 죽지 않은 상황에서 계속 새로운 프로세스의 타이머가 만들어져 타이머로서의 기능을 할 수 없게 됩니다.

 

stop button을 클릭 하면 TimerTask가 작동중인지 확인하고 삭제를 하게 됩니다.

 

public void btnStop(View view) {
    Log.d(
"BTN Stop==>", nCnt + " work!!!");
   
if(timerTask != null) {
       
timerTask.cancel();
    }
}

 

타이머가 호출하는 작업 메소드는 단순히 증가하는 숫자를 로그로 남겨줍니다.

 

private void someWork() {

    Log.d(
"Test some work ==>", nCnt + " work!!!");

   
nCnt++;
}

 

화면은 그냥 버튼 2개만 추가 하였습니다.

 

 

로그에 남겨진 텍스트를 보면 어떻게 작동하는지 알 수 있습니다.  start 버튼에 cancel 로직을 주석처리해서 비교해 보면서 자신에 맞는 로직으로 수정하면 됩니다.

  

D/BTN Start==>: 0 work!!!
D/Test some work ==>: 0 work!!!
D/Test some work ==>: 1 work!!!
D/Test some work ==>: 2 work!!!
D/Test some work ==>: 3 work!!!
D/BTN Stop==>: 4 work!!!
D/BTN Start==>: 4 work!!!
D/Test some work ==>: 4 work!!!
D/Test some work ==>: 5 work!!!
D/Test some work ==>: 6 work!!!
D/BTN Stop==>: 7 work!!!

 

 

 

전체 소스

 

package copycoding.tistory.timertest;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.view.View;

import java.util.Timer;
import java.util.TimerTask;

public class MainActivity extends AppCompatActivity {

   
private Timer timerCall;
   
private int nCnt;
    TimerTask
timerTask;

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

       
nCnt = 0;

       
timerCall = new Timer();

    }

   
private void someWork() {

        Log.d(
"Test some work ==>", nCnt + " work!!!");

       
nCnt++;
    }

   
public void btnStart(View view) {
        Log.d(
"BTN Start==>", nCnt + " work!!!");
       
if(timerTask != null) {
           
timerTask.cancel();
        }
       
timerTask = new TimerTask() {
           
@Override
           
public void run() {
                someWork();
            }
        };
       
timerCall.schedule(timerTask,0,3000);
    }

   
public void btnStop(View view) {
        Log.d(
"BTN Stop==>", nCnt + " work!!!");
       
if(timerTask != null) {
           
timerTask.cancel();
        }
    }
}

 


+ Recent posts