在这篇文章中,我将继上一篇,讲解用Handler来构建最简单的周期性触发的定时器,您可以加以修改,构建更为复杂的定时器。
◆ 在代码中定义一个整形常量,代表消息的ID。此处不妨对其取名为TIMERID。
◆创建自己的Handler,在该Handler中HandlerMessage处理函数中。在消息处理函数中,我们首先发送消息TIMERID,并指定其延迟的时间,单位为毫秒。然后可以调用相应的事务处理函数。需要注意的是,如果事件处理函数花费的时间过长,则下次消息到来时,会导致不能及时处理。
◆创建startTimer函数,在该函数中触发定时器,实际上就是发送一个TIMERID消息,来第一次触发消息。
◆创建stopTimer函数,在该函数中停止定时器,实际上就是把TIMERID的消息从消息队列中删除即可。
下面让我们来以代码作为说明。
package com.android.mytimer;
import android.os.Handler;
import android.os.Message;
public class MyTimer extends Handler
{
private static int TIMERID = 0; //静态变量,保证ID唯一。当ID超过整形最大值时,应该把它恢复为0
private final int mInterval;
public interface CallBack{
void timerCallBack();
}
private CallBack mCallBack;
public MyTimer(int interval, CallBack callback)
{
mInterval = interval;
mCallBack = callback;
TIMERID++;
}
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
if( msg.what == TIMERID)
{
Message message = obtainMessage(TIMERID);
this.sendMessageDelayed(message, mInterval);
//for speed up, NO NULL Pointer exception check
mCallBack.timerCallBack();
}
}
public void startTimer()
{
Message msg = this.obtainMessage(TIMERID);
this.sendMessage(msg);
}
public void stopTimer()
{
this.removeMessages(TIMERID);
}
}
其中接口CallBack是一个回调函数,使用这个定时器的应用必须实现该接口,并且在构造函数当中传入该类。如下
public class TestTimer implement MyTImer.CallBack
{
MyTimer mTimer;
public TestTimer()
{
mTimer = new MyTImer(10, this);
mTimer.start();
}
void timerCallBack();
{
Log.i("TestTimer", "this is the timerCallBack");
}
}