上篇简述了MainButtonUIManager,涉及到public属性的handler,通过该handler能够频繁的更新UI,尤其是音乐播放的进度条,和音乐进行的时间。
代码较短,直接上了:
public class MusicTimer {
public final static int REFRESH_PROGRESS_EVENT = 0x100;//256
private static final int INTERVAL_TIME = 1000;
private Handler[] mHandler;
private Timer mTimer;
private TimerTask mTimerTask;
private int what;
private boolean mTimerStart = false;
public MusicTimer(Handler... handler) {
//这种参数接受方式类似于Handler[] handler,响应的传入参数方式可以是MusicTimer(handler1,handler2,...)
this.mHandler = handler;
this.what = REFRESH_PROGRESS_EVENT;
mTimer = new Timer();
}
/**
* 通过定时器执行定时任务
*/
public void startTimer() {
if (mHandler == null || mTimerStart) {
//此处应该抛出异常mHandler都为null了也就应该提示开发者代码调用错误,尽管执行不到这里
return;
}
mTimerTask = new MyTimerTask();
mTimer.schedule(mTimerTask, INTERVAL_TIME, INTERVAL_TIME);//第二和第三个参数是多少秒后执行和多少秒重复执行task
mTimerStart = true;
}
/**
* 调用TimerTask的cancel()方法结束任务
*/
public void stopTimer() {
//当任务开始才可以结束
if (!mTimerStart) {
return;
}
mTimerStart = false;
if (mTimerTask != null) {
mTimerTask.cancel();
mTimerTask = null;
}
}
class MyTimerTask extends TimerTask {
@Override
public void run() {
if (mHandler != null) {
//一个高级for循环,遍历所有的handler并发送消息,这里只有一个handler,what并没有在handler处有用
for (Handler handler : mHandler) {
Message msg = handler.obtainMessage(what);
msg.sendToTarget();
}
}
}
}
}