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

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