Andorid歌词秀设计思路SafetyTimer

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Andorid歌词秀设计思路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
  •  
  • new
  • new
  •  
  • public void
  • switch
  • case 1:     
  •                 setTitle("hear me?");        //这里才是要做的事情。
  • break;     
  •                  
  • super.handleMessage(msg); 
  •          
  •     ; 
  • new
  •  
  • public void
  • new
  • 1;     
  •             handler.sendMessage(message);   
  •          
  •          
  •     ; 
  • public void
  • super.onCreate(savedInstanceState); 
  •         setContentView(R.layout.main); 
  • timer.schedule(task,10000);    //启动定时器
  •      
  •    看起来挺累的吧,但是又不得不看。有没有办法把这件事弄的漂亮一点呢,有。
     
    首先,我们想要什么呢。比如下面这样
  • public class TestTimerextends

  • Timer t = new Timer(10000, new OnTimeListener()
  •      public void OnTimer()
  •              setTitle("hear me?");        //要做的事情。
  •       
  •  );
  •   
  • public void
  • super.onCreate(savedInstanceState);
  •         setContentView(R.layout.main); 
  • timer.start();    //启动定时器
  •    
  •   是不是好多了。这样的代码在Android里到处都是,关键是我们自己做的代码会不会做成这样的。
    总结一下,其实我们想要的是:

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

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

 下面是实际的代码,供参考。也可以到以下地址下载:​​javascript:void(0)​​

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);
 

以上是关于Andorid歌词秀设计思路SafetyTimer的主要内容,如果未能解决你的问题,请参考以下文章

如何让歌词与歌曲同步显示

《Andorid群英传》---读书笔记10.1

高并发业务接口的开发思路(转)

玩转3D Swiper性感秀之思路分析总结

网页设计,怎么做歌词与音乐同步?

老司机双十一厚礼之玩转 3D Swiper 性感秀之思路分析总结