总结了一下更新歌曲播放进度条seekbar的三种方法
1. 只使用handler来进行更新
2. 使用计时器Timer+TimerTask
3. 使用线程池ExecutorService
2. 使用计时器Timer+TimerTask
3. 使用线程池ExecutorService
实现后的效果图:
下面详细讲一下三种做法
方法一 使用handler来更新进度条
点击播放按钮,在播放按钮的点击事件中添加此行代码
handler.sendEmptyMessage(UPDATE); //发送Message
然后在handleMessage()方法中的UPDATE信息下每间隔0.5秒发送Message来不断刷新seekbar
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case MUSICDURATION:
seekbar.setMax(playService.getDuration());
break;
case UPDATE:
try {
seekbar.setProgress(playService.getMediaPlayer().getCurrentPosition());
} catch (Exception e) {
e.printStackTrace();
}
//handler.sendEmptyMessageDelayed(UPDATE);
handler.sendEmptyMessageDelayed(UPDATE,500);
break;
}
}
方法二 使用计时器Timer+TimerTask
创建一个Timer对象和TimeTask对象,TimerTask实现了Runnable接口,所以创建时要重写run方法
private TimerTask timertask = new TimerTask() {
@Override
public void run() {
try {
if (playService.getMediaPlayer() != null && playService.isPlaying == true) {
handler.sendEmptyMessage(UPDATE);
}
} catch (Exception e) {
e.printStackTrace();
}
}
};
在ServiceConnection中的onServiceConnected()方法的最后调用schedule()方法,启动计时器,开始执行timertask,这样保证了playService一定在子线程里获取到之后才开始更新主线程UI,不会有空指针报错问题,schedule(TimerTask task,long delay,long period)方法在delay毫秒后开始执行,每隔period毫秒后执行下一次动作
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
PlayService.PlayBinder playBinder = (PlayService.PlayBinder) service;
playService = playBinder.getPlayService();
handler.sendEmptyMessage(MUSICDURATION);
timer.schedule(timertask, 0, 500);
//executeservice.execute(updateRunnable);
}
方法三 使用线程池ExecutorService
创建一个ExecutorService对象,一个updateRunnable对象
private ExecutorService executeservice = Executors.newSingleThreadExecutor(); //创建一个单线程化的线程池
private Runnable updateRunnable = new Runnable() {
@Override
public void run() {
while (true) {
try {
if (playService.getMediaPlayer() != null && playService.isPlaying == true) {
handler.sendEmptyMessage(UPDATE);
}
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO: handle exception
}
}
}
};
这样保证了playService一定在子线程里获取到之后才开始更新主线程UI,不会有空指针报错问题
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
PlayService.PlayBinder playBinder = (PlayService.PlayBinder) service;
playService = playBinder.getPlayService();
handler.sendEmptyMessage(MUSICDURATION);
executeservice.execute(updateRunnable);
}
demo是在android studio上面写的,打包文件太大,就直接打包核心文件给大家
核心文件下载链接:http://pan.baidu.com/s/1c16JN3a
核心文件下载链接:http://pan.baidu.com/s/1c16JN3a