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.sendMessage(message);
}
};
mTimer = new Timer();
mTimer.schedule(mTask, 0, mInterval);
}
//停止Timer動作
//釋放獲得的資源。
public void stopTimer(){
mTimer.cancel();
mTimer.purge();
mTimer = null;
mHandler = null;
mTask = null;
Log.i(TAG, "stopTimer()");
}
//Timer是否處於工作狀態。
public boolean isRunging(){
return (mTimer != null);
}
}
作者“道法自然”