프로그램/Android

(아주중요) 안드로이드 Timer 사용하기 (아주중요)

네오류이 2021. 1. 9. 10:12
728x90
반응형

Android에서 timer를 구현하려면 timer와 timertask라는 두 개의 object가 필요하다.

Android는 Chronometer라는 class로 timer를 제공하고 있는데, 
이것을 사용하지 못한 이유는 millisecond단위의 시간을 지원하지 않아서이다. 
물론 약간의 수정으로 사용할 수 있을지도 모르지만 timer class를 한 번 사용해 보기로 했다. 

 

Timer timer;

TimerTask timerTask;

timer = new Timer(); 

timerTask = new TimerTask() {

public void run(){

//to do something

}

};

timer.schedule(timerTask, 0, 10); //0초 이후 시작하여 10ms마다 한번씩 timeTask의 run을 작동시킨다.

 
이렇게 하여 timerTask를 사용할 경우, 
thread를 생성하여 timer를 작동시키지만,  이 thread는 UI를 변경할 수 없다. 
그래서 TextView의 text를 변경시키기 위해 setText를 호출한다거나 하는 작업은 이 run()함수 안에서 사용할 수 없다. 

만약, UI를 변경해야 하는 일을 run()함수안에서 해야한다면 thread를 UI tread를 생성해야한다. 

timer = new Timer();

timerTask = new TimerTask() {

public void run(){

(activity).this.runOnUiThread(new Runnable(){

public void run(){

(textview).setText("some string");

}

});

}

};

timer.schedule(timerTask, 0, 1000);  //0초 이후 시작하여 1s마다 한번씩 timeTask의 run을 작동시킨다.

 
이런식으로 UI thread 를 사용한다면 UI를 변경하는 작업을 할 수 있게된다. 

또한 timer의 sehedule함수를 사용하여 이 run()함수를 주기적으로 호출할 수 있다. 
 
하지만 UI thread도 한계가 있는데, 이것은 activity에서만 사용할 수 있다는 점이다. 
그리하여 이에 대한 대안이 하나 더 있다. 
Handler와 Runnable을 사용하는 것이다. 
이에 대한 자세한 사항은 ANDROID developers에서도 다루고 있다.  

Handler mHandler;

Runnable mTimerTask;

mHandler = new Handler();

mTimerTask = new Runnable(){

public void run()

{

 

 

 

//to do something

 

 

 

 

 

 

 

 

mHandler.postDelayed(thisTIMELIMIT);

 

 

 

}

};

mHandler.removeCallbacks(mTimerTask);

mHandler.postDelayed(mTimerTaskTIMELIMIT); 

 //TIMELIMET 후에 run 호출


 이렇게 하면, TIMELIMIT 만큼의 주기로 run()을 호출한다. 



출처: http://gema.tistory.com/418 [그러니까그게..]



728x90
반응형