android 更新歌曲播放进度条seekbar的三种方法

来源:互联网 发布:win7网络共享无法打开 编辑:程序博客网 时间:2024/05/02 06:45

总结了一下更新歌曲播放进度条seekbar的三种方法

1. 只使用handler来进行更新 
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                }            }        }    };


在ServiceConnection中的onServiceConnected()方法的最后调用executor()方法,开始执行updateRunnable线程
这样保证了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

1 0
原创粉丝点击