原文链接:http://www.leake86.net/blog/?p=66 ,转载请保留链接;
附送官方TimerAPI:http://developer.android.com/reference/java/util/Timer.html
应用背景:
在开发过程中,需要用到执行重复的任务(例如计时器之类的东西),就可以使用Timer+TimerTask,建立计时器,建立定时任务,来循环执行某件事情。
执行效果:
一、简单应用
TimerTask实际上是一个后台线程,实际执行任务者。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
@Override
public
void
run() {
// TODO Auto-generated method stubF
mGameTime = (mGameTime +
100
.0f /
1000
.0f);
//计算游戏时间
if
(mGameTime > MAX_GAMETIME||gameStatus==
false
) {
Message msg =
new
Message();
msg.what = STOP;
timerHandler.sendMessage(msg);
//向Handler发送信息
}
else
{
Message msg =
new
Message();
msg.what = NEXT;
timerHandler.sendMessage(msg);
}
}
};
|
Timer是对线程进行参数设定,并控制线程的生命周期。
this.timer = new Timer(true);
this.timer.schedule(timerTask, 0L, 100L);
参数说明:
void | schedule(TimerTask task, long delay, long period)
Schedule a task for repeated fixed-delay execution after a specific delay.
|
0L是延迟时间,执行完一次之后等待0L再执行下一次。(单位是ms毫秒)
100L是循环时间,每隔100L执行一次任务。(单位是ms毫秒)
这里的就是每隔0.1s执行一次timerTask任务。
Handler内容:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
private
Handler mHandler =
new
Handler() {
public
void
handleMessage(Message msg) {
switch
(msg.what) {
case
GameEngine.STOP:
System.out.println(
"Time's up!!!"
);
break
;
case
GameEngine.NEXT:
if
(!Thread.currentThread().isInterrupted()) {
rectangleProgressBar.setProgress((
int
)(engine.getGameUseTime()/GameEngine.MAX_GAMETIME*
100
)+
1
);
//更新进度条内容
}
break
;
}
}
};
|
二、如何正确使用Timer
问题背景:在使用Timer的时候会遇界面切换,导致Timer新建多个对象,多次执行Task,最终系统资源不足导致程序崩溃。
这种问题就需要对Timer的生命周期做好控制。
在停止Timer的时候,就要把Timer cancle掉,再把TimerTask cancle掉,并把两个对象指向为空,保证系统对两个对象进行回收内存。
例如:
(1)新建对象
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
if
(timerTask==
null
) {
timerTask =
new
TimerTask() {
@Override
public
void
run() {
// TODO Auto-generated method stubF
mGameTime = (mGameTime +
100
.0f /
1000
.0f);
if
(mGameTime > MAX_GAMETIME||gameStatus==
false
) {
Message msg =
new
Message();
msg.what = STOP;
timerHandler.sendMessage(msg);
}
else
{
Message msg =
new
Message();
msg.what = NEXT;
timerHandler.sendMessage(msg);
}
}
};
}
if
(
this
.timer==
null
) {
this
.timer =
new
Timer(
true
);
this
.timer.schedule(timerTask, 0L, TIME_INTERVAL);
}
|
(2)销毁对象
1
2
3
4
5
6
7
8
9
10
11
|
public
void
stopGame() {
gameStatus =
false
;
if
(timerTask!=
null
) {
this
.timerTask.cancel();
this
.timerTask =
null
;
}
if
(timer!=
null
) {
this
.timer.cancel();
this
.timer=
null
;
}
}
|
这样做就可以保证Timer,TimerTask同一个对象不会执行多次任务。