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(this, TIMELIMIT);
}
};
mHandler.removeCallbacks(mTimerTask);
mHandler.postDelayed(mTimerTask, TIMELIMIT);
//TIMELIMET 후에 run 호출
이렇게 하면, TIMELIMIT 만큼의 주기로 run()을 호출한다.
출처: http://gema.tistory.com/418 [그러니까그게..]
'프로그램 > Android' 카테고리의 다른 글
폰갭빌드를 command line 으로 하는거 힘들다.. PhoneGap 빌드 사이트 사용 (0) | 2021.01.14 |
---|---|
폰갭 애플 앱스토어에 등록하기 질의응답 (0) | 2021.01.14 |
빌드된 apk 파일을 서명하기 - 등록하기 위해 필요 (0) | 2021.01.14 |
PhoneGap 이란 ? (0) | 2021.01.10 |
[필독]AngularJS를 알아보자 (0) | 2021.01.09 |