Andorid歌词秀设计思路(1)SafetyTimer

在Android中实现多媒体播放功能主要是通过MediaPlayer实现的。为了方便用户检测MediaPlayer的动作状态,Andorid为我们提供了一下接口

 

Nested Classes

 interface MediaPlayer.OnBufferingUpdateListener

Interface definition of a callback to be invoked indicating buffering status of a media resource being streamed over the network.

 interface MediaPlayer.OnCompletionListener Interface definition for a callback to be invoked when playback of a media source has completed.
 interface MediaPlayer.OnErrorListener Interface definition of a callback to be invoked when there has been an error during an asynchronous operation (other errors will throw exceptions at method call time).
 interface MediaPlayer.OnInfoListener Interface definition of a callback to be invoked to communicate some info and/or warning about the media or its playback.
 interface MediaPlayer.OnPreparedListener Interface definition for a callback to be invoked when the media source is ready for playback.
 interface MediaPlayer.OnSeekCompleteListener Interface definition of a callback to be invoked indicating the completion of a seek operation.
 interface MediaPlayer.OnVideoSizeChangedListener Interface definition of a callback to be invoked when the video size is first known or updated 

 通过这些接口可以检测

1.流媒体缓冲的状态

2.播放结束

4.信息交换(不好意思,是什么信息没有确认过。)

5.媒体准备好

6.定位结束

7.视频尺寸变化

但是无论谁做播放器都想知道的现在的播放位置却没有监测手段。为了解决这个问题,有一个很自然得想法就是做一个定时器。

关于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里到处都是,关键是我们自己做的代码会不会做成这样的。

总结一下,其实我们想要的是:

直说了吧,这就是Observer的简化版。不难吧,但是实际工作中会这么做的恐怕还真就不多。

其实这看似不大的一步,会从根本上改变我们的程序结构的。

 下面是实际的代码,供参考。也可以到以下地址下载:http://download.csdn.net/source/3555353

 

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 {
 Timer mTimer = null;
 Handler mHandler = null;
 TimerTask mTask = null; 
 OnTimeListener mListener = null;
 long mInterval = 0; //in milliseconds
 boolean mRepeate = false;  //是否为重复Timer,指定为false时只动作一次(未经测试)
 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(boolean repeate){
  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();
  if(repeate){
   mTimer.schedule(mTask, 0, mInterval);
  }else{
   mTimer.schedule(mTask, mInterval);
  }
  mRepeate = repeate;
  Log.i(TAG, "startTimer(" + repeate + ")");
 }
 
 //停止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);
 }
}

 

你可能感兴趣的:(Android)