우선, 시계를 출력하려면 당연히 Timer가 필요하다.
java.util.Timer Class 를 이용해서 일정한 주기로 Task를 실행할 수 있다.
Task는 Method를 넘겨주는게 아니라, 역시 TimerTask의 SubClassing 해서 구현한 다음 해당 Class의 Object를 넘겨줘야한다.
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mCurTimeTextView = (TextView) findViewById(R.id.CurrentTimeTextView);
MainTimerTask timerTask = new MainTimerTask();
mTimer = new Timer();
mTimer.schedule(timerTask, 500, 1000);
}
Activity 가 생성될때, 불러지는 onCreate를 Override하여, TimerTask Object와 Timer Object를 만들고, timer의 schedule method를 통하여,
일정 주기로 Task가 호출 될 수 있게 한다.
2번째 Argument가 최초 실행 timing이고, 3번째 Argument가 실행 주기이다. 초단위로 시계를 보여줄것이기 때문에,
1초마다 호출되도록 프로그래밍 하였다.
private Handler mHandler = new Handler();
private Runnable mUpdateTimeTask = new Runnable() {
public void run() {
......
}
};
class MainTimerTask extends TimerTask {
public void run() {
mHandler.post(mUpdateTimeTask);
}
}
MainTimerTask Class구현부가, InnerClass 로 TimerTask를 SubClassing한 형태인데,
Android에서는 MainThread이외에서는 UI Object를 제어 할 수 없기 때문에,
Handler를 통해서 MainThread에 Task를 넘겨 준다.
즉 시간을 Update하는 부분은 Runnable Object의 Run() Method이다.
Run() Method는 아래와 같이 구현한다.
Date rightNow = new Date();
SimpleDateFormat formatter = new SimpleDateFormat(
"hh:mm:ss dd.MM.yyyy");
String dateString = formatter.format(rightNow);
mCurTimeTextView.setText(dateString);
현재 시간을 가져오기 위해 java.util.Date Class를 사용했으며,
Date를 String으로 변환하기위해 java.text.SimpleDateFormat Class를 사용하였다.
SimpleDateFormat Class에 대한 자세한 사용법은 http://developer.android.com/reference/java/text/SimpleDateFormat.html 를 참고 하길 바란다.
formatter를 통해서 Date String을 만들고 해당 String을 TextView에 setTest로 setting함으로써 시간을 세팅할 수 있다.
이외에 유의 해야 할점은 Activity Life Cycle에 따른 Timer stop/start 이다.
onDestory/onPause 에서 Timer 를 정지 시키고, onResume에서 재 시작해주도록 아래와 같이 프로그래밍 한다.
@Override
protected void onDestroy() {
mTimer.cancel();
super.onDestroy();
}
@Override
protected void onPause() {
mTimer.cancel();
super.onPause();
}
@Override
protected void onResume() {
MainTimerTask timerTask = new MainTimerTask();
mTimer.schedule(timerTask, 500, 3000);
super.onResume();
}
간단한 프로그래밍이지만, Android Life Cycle/ MultiThread에서의 UI 제어등 알아두어야 할것이 꽤 있다.