안드로이드 타이머 만들기 (TimerTask & Timer & Calendar & Date)
메인스레드를 이용해 정해진 시간까지 카운트(초)를 갱신하는 작업을 진행했다. 안드로이드는 자바 언어를 사용하므로 자바 언어를 어느정도 알아야 한다. 아이폰의 경우 오브젝티브-C와 스위프트 언어를 학습하고 하면 된다.
아이폰으로는 비교적 쉽게 만들었다. 리소스가 많은편이고 경험도 어느정도 있기때문에.
안드로이드의 경우는 검색하는 것 조차도 어려울정도로 문외한이고 기본적인 학습도 안된 상태로 운영 중인 앱에 기능을 넣다보니 맨땅에 헤딩하는 수준이다. 그래도 하나씩 풀어 만들어질 때 희열은 있다. 재미있다.
Timer timer;
public void runTask() {
TimerTask task = new TimerTask() {
@Override
public void run() {
Calendar now = Calendar.getInstance();
Date from = now.getTime();
Date to = targetCal.getTime();
final long diff = (to.getTime() - from.getTime()) / 1000;
//Log.e("<<TIME>>", "diff == "+ diff);
if (diff == 0) {
targetCal = Calendar.getInstance();
targetCal.add(Calendar.SECOND, 60);
//TODO
activityMain.runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getContext(),"메시지", Toast.LENGTH_SHORT).show();
}
});
}
//Log.d("<<B>>", "새로고침" + diff + "초전");
activityMain.runOnUiThread(new Runnable() {
@Override
public void run() {
topRightMessage.setText("새로고침 " + diff + "초 후");
}
});
}
};
timer = new Timer();
timer.schedule(task, 0, 100);
}
일단 runTask()라는 함수를 하나 만들었고
현재 시간에 60초를 더해, 남은 초를 카운팅하고 60초가 지나면 다시 현재 시간을 구하고 그 시간에 60초를 더해서 계속 반복하는 소스다.
인터넷 소스를 찾아보니, TimerTask의 cancel()메서드를 이용해 중지를 해도 된다고 되어 있는데 나의 경우 잘 안되, timer의 cancel() 메서드를 이용해 중지하도록 하였다.
또, 재실행을 하려고 timer의 schedule()을 호출했지만 이미 실행중이라는 오류가 뜨면서 앱이 종료되어, 이것도 검색을 해서 찾아보니 재실행할 때마다 새로 TimerTask를 만들어 주라고 해서 runTask()라는 함수를 만들어서 적용했다.
그리고 처음에는 카운트로만 계산을 해서 라벨에 값을 업데이트 했는데 메인스레드의 버벅됨으로 인해 자연스럽지 못하는 부분이 생겨 시간을 이용하기로 했다.
Calendar now = Calendar.getInstance();
Date from = now.getTime();
Date to = targetCal.getTime();
final long diff = (to.getTime() - from.getTime()) / 1000;
Calendar 의 getInstance()를 이용해 현재 시간을 획득한 다음
from, to를 정하고 각각의 Calendar에서 getTime()을 구해 뺀 뒤 초단위로(/1000)하면 두 시간 사이의 초를 구할 수 있다.
diff가 0이면 두 시간이 같으므로 다시 현재 시간을 구하고 그 값에 60초를 더한다.
if (diff == 0) {
targetCal = Calendar.getInstance();
targetCal.add(Calendar.SECOND, 60);
//TODO
activityMain.runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getContext(),"메시지", Toast.LENGTH_SHORT).show();
}
});
}
그리고 하나더 주의할 것은 1초에 한번 화면을 갱신한다고 해서 schedule() 을 호출할때 1000(1초)을 주면 절대 안된다.
timer = new Timer();
timer.schedule(task, 0, 100);
task를 실행할 때 100 (0.1초)를 주어 시간을 계산해서 초를 표시하도록 하는것이 바람직하다.
별건 없지만 유용한 타이머 만들기 시간이었다. 시간과 메인스레드에서의 UI조작 등에 대한 개념과 학습이 되었던 몇 일.
이제 또 다음으로 넘어가보자.
'프로그래밍 > Android' 카테고리의 다른 글
Android의 setTag()와 getTag() (0) | 2018.10.22 |
---|---|
Adapter 와 AdapterView (0) | 2018.10.22 |
Android Main Thread UI처리 관련 팁. (0) | 2018.10.16 |
Gradle Scripts 항목에 대한 이해 (0) | 2018.10.15 |
px to dp & dp to px (0) | 2018.10.12 |