Andorid歌词秀技术要点(1)SafetyTimer
Android中使用Timer时需要同时访问TimerTask,Handle等类,手续繁杂而且是真正想做的事淹没在手续化的代码中。本文介绍了的SaftyTimer类隐藏了TimerTask,Handle等类,并通过Observer设计模式为用户提供简单,低耦合的实现方式。
关于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); //启动定时器
}
}
看起来挺累的吧,要找到我们真正想做的事还真是不容易。但是又不得不看。有没有办法把这件事弄的漂亮一点呢,有。
首先,我们想要什么呢。比如下面这样
public class TestTimerextends Activity {
Timer t = new Timer(10000, new OnTimeListener(){
public void OnTimer(){
setTitle("hear me?"); //要做的事情。
}
});
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
timer.start(); //启动定时器
}
}
是不是好多了。这样的代码在Android里到处都是,关键是我们自己做的代码会不会做成这样的。
总结一下,其实我们想要的是:
我们通过SaftyTimer封装了灰色的Timer,TimerTask,Handler的功能然后通过定义SaftyTimer:OnTimeListener为利用者提供实现所需功能的途径。
下面是时序图
从图中可以很清楚的看到从LayerPlayerService出发的调用中除了生成新对象的2条线以外,只有StartTimer,OnTimer,StopTimer三条线。而SaftyTimer右侧的调用则相对会复杂很多。这就是封装的效果。
直说了吧,这就是Observer的简化版。不难吧,但是实际工作中会这么做的恐怕还真就不多。
这看似不大的一步,会从根本上改变我们的程序结构的。你认为呢?
以下是源代码,请参考
package LyricPlayer.xwg;
import java.util.Timer;
import java.util.TimerTask;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
public class SafetyTimer {
private Timer mTimer = null;
private Handler mHandler = null;
private TimerTask mTask = null;
private OnTimeListener mListener = null;
private long mInterval = 0; //in milliseconds
private static final String TAG = new String("SafetyTimer");
//Observer接口定义
public interface OnTimeListener{
public void OnTimer();
}
//创建定时器并指定Observer
public SafetyTimer(long interval, OnTimeListener listener){
mInterval = interval;
mListener = listener;
}
//启动定时器
public void startTimer(){
mHandler = new Handler(){
public void handleMessage(Message msg) {
if(mListener != null){
mListener.OnTimer();
Log.i(TAG, "mListener.OnTimer()");
}
super.handleMessage(msg);
}
};
mTask = new TimerTask(){
public void run() {
Message message = new Message();
message.what = 0; //anything is ok.
mHandler.sendMess
补充:移动开发 , Android ,