Android歌词秀设计思路(1)SafetyTimer
Android中使用Timer时需要同时访问TimerTask,Handle等类,手续繁杂而且是真正想做的事淹没在手续化的代码中。本文介绍了的SafetyTimer类隐藏了TimerTask,Handle等类,并通过Observer设计模式为用户提供简单,低耦合的实现方式。
首先看一下SafetyTimer在整个软件中的位置。
有点偏,不过没有关系。
让我们开始。
关于Android定时器的使用,网上有很多例子。一般来讲是这样的。
public class TestTimerextends Activity {
Timer timer = new Timer();
Handler handler = new Handler(){
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
setTitle("hear me?"); //这里才是要做的事情。
break;
}
super.handleMessage(msg);
}
};
TimerTask task = new TimerTask(){
public void run() {
Message message = new Message();
message.what = 1;
handler.sendMessage(message);
}
};
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
timer.schedule(task,10000); //启动定时器
}
}
之所以要这么麻烦的原因是TimerTask的run方法是在一个独立的Task里执行的,和我们的用用不在一个上下文中,所以不能直接在TimerTask的run方法中执行我们希望定期执行的代码。
作为解决这个问题的方案之一,引入了Handler类,先由TimerTask调用Handler.sendMessage(多任务安全)向Handler发消息(在这个地方,其实什么消息都可以),Android先可以保证,等到Handler.handleMessage的时候,就已经是和应用在同一个上下文里了。
以下是参考资料
Timer:http://developer.android.com/reference/java/util/Timer.html
TimerTask:http://developer.android.com/reference/java/util/TimerTask.html
Handler:http://developer.android.com/reference/android/os/Handler.html
看起来挺累的吧,要找到我们真正想做的事还真是不容易。但是又不得不看。有没有办法把这件事弄的漂亮一点呢,有。
方法1:利用类的继承
首先写一个如下的基类,基本上例子中的代码相同,只是在定义了一个没有内容的OnTimer方法留给派生类实现。
public class TemplateMethodTimer {
private Timer mTimer = null;
private Handler mHandler = null;
private TimerTask mTask = null;
//TemplateMethod接口定义,具体动作有派生类时装。
public void OnTimer(){
}
//启动定时器
public void startTimer(long interval){
mHandler = new Handler(){
public void handleMessage(Message msg) {
OnTimer(); //调用模板方法。
super.handleMessage(msg);
}
};
mTask = new TimerTask(){
public void run() {
Message message = new Message();
message.what = 0; //anything is ok.
mHandler.sendMessage(message);
}
};
mTimer = new Timer();
mTimer.schedule(mTask, 0, interval);
}
//停止Timer动作
//释放获得的资源。
public void stopTimer(){
mTimer.cancel();
mTimer.purge();
mTimer = null;
mHandler = null;
mTask = null;
}
}
有了这个类我们就可以相下面这样先定义一个派生类并提供OnTimer方法的实现。
class MyTimer extends TemplateMethodTimer{
public void OnTimer(){
Log.i(TAG, "MyTimer.OnTimer");
}
}
然后创建一个定时器并进行启动停止操作
MyTimer mMt = new MyTimer();
mMt.startTimer(500);
mMt.stopTimer();
当然在JAVA中我们可以向下面这样创建Timer
TemplateMethodTimer mTt = new TemplateMethodTimer(){
public void OnTimer(){
Log.i(TAG, "TestTimer.OnTimer");
}
};
本质上是一样的代码。
方法2:利用类的Observer设计模式,这时Timer类是这样的。
public class ObserverTimer {
补充:移动开发 , Android ,