当前位置:操作系统 > 安卓/Android >>

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 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,