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

本文介绍了在Android中更新歌曲播放进度条SeekBar的三种方法:1) 使用Handler,2) 利用Timer和TimerTask,3) 通过ExecutorService进行更新。详细探讨了每种方法的实现和应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

总结了一下更新歌曲播放进度条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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值