【Android应用开发】Timer的使用,制作游戏倒计时进度条

原文链接: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同一个对象不会执行多次任务。

你可能感兴趣的:(Android)