Android歌词秀设计思路(1)SafetyTimer(5)
mOt.stopTimer();
是不是好多了。这样的代码在Android里到处都是,关键是我们自己做的代码会不会做成这样的。
用法好像区别不大,那么哪个个方法更好些呢?
方法1是定义了,一个不知道自己应该干什么的基类,然后通过派生类实现做某某事的Timer。抽象的是Timer。
方法2是定义的一个专门响应Timer的Listener基类,通过Listener的派生类实现具体的功能工作。抽象的要做的事,应该说更接近本质吧。即使是从功利的角度来看也可以看出Listener是可以动态登录和删除,比较灵活。当然更不用说如果对Obersever稍加改造,可以实现多个对象响应Timer事件了。
不言自明了吧。
通过本文,我们可以看到通过Observer设计模式封装,隐藏复杂的Timer处理的方法。这样下一个再用Timer的人,就不必再走一次别人已经走过的路而把节约下来的时间用在其他需要挑战的地方。这样做其实没有什么难度,但是实际工作中会这么做的恐怕还真就不多。无论如何请相信:这看似不大的一步,会从根本上改变我们的程序结构的。
在Android歌词秀中用到的SaftyTimer类,就是用方法二实现的,供参考。
我们通过SaftyTimer封装了灰色的Timer,TimerTask,Handler的功能然后通过定义SaftyTimer:OnTimeListener为利用者提供实现所需功能的途径。
下面是时序图
从图中可以很清楚的看到从LayerPlayerService出发的调用中除了生成新对象的2条线以外,只有StartTimer,OnTimer,StopTimer三条线。而SaftyTimer右侧的调用则相对会复杂很多。这就是封装的效果。
以下是源代码
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(){
相关新闻>>
- 发表评论
-
- 最新评论 更多>>