音乐播放器进度条更新的一个问题

lin_kin_p 2015-12-02 10:15:52
参照网上的思路就是用一个定时器,定时的把当前播放的进度发送给activity,activity再来更新seekbar。但是我发现不管是在service里面定时通过广播发给activity,还是activity里面定时去service里面取当前播放进度,都会明显的感觉卡顿一下。我是一秒钟更新一次。怎么解决这个问题?
...全文
429 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
黄子落 2016-11-17
  • 打赏
  • 举报
回复
然而事实上是我们在对seekbar进行监听时,忘记判断是否是用户操作,所以当自动更新seekbar进度时,监听事件一直触发,执行seekto()方法,导致出现卡顿,只要加个判断就可以了
lin_kin_p 2015-12-05
  • 打赏
  • 举报
回复
引用 15 楼 woshiyyshow 的回复:
[quote=引用 14 楼 lin_kin_p 的回复:] [quote=引用 13 楼 woshiyyshow 的回复:] 更新进度条本身就是得在主线程里面进行的, 但是, 你音乐播放是在异步线程里面实现的, 你可以把音乐播放放置在service里面, 应该不会出现卡顿的现象吧.
音乐播放我是放在service里面的,如果在播放,service就每隔一秒把播放进度发到activity。[/quote] 我这是用取的, 不是推的, 每隔一秒获取一次播放进度. 在handlr里面直接调用mHandle.sendEmputyMessagetoDelay("", 1000); 试一下看看呢.[/quote] 还是卡。。能不能麻烦贴下你这部分的代码。。
柒加伊 2015-12-05
  • 打赏
  • 举报
回复
引用 14 楼 lin_kin_p 的回复:
[quote=引用 13 楼 woshiyyshow 的回复:] 更新进度条本身就是得在主线程里面进行的, 但是, 你音乐播放是在异步线程里面实现的, 你可以把音乐播放放置在service里面, 应该不会出现卡顿的现象吧.
音乐播放我是放在service里面的,如果在播放,service就每隔一秒把播放进度发到activity。[/quote] 我这是用取的, 不是推的, 每隔一秒获取一次播放进度. 在handlr里面直接调用mHandle.sendEmputyMessagetoDelay("", 1000); 试一下看看呢.
柒加伊 2015-12-05
  • 打赏
  • 举报
回复
引用 16 楼 lin_kin_p 的回复:
[quote=引用 15 楼 woshiyyshow 的回复:] [quote=引用 14 楼 lin_kin_p 的回复:] [quote=引用 13 楼 woshiyyshow 的回复:] 更新进度条本身就是得在主线程里面进行的, 但是, 你音乐播放是在异步线程里面实现的, 你可以把音乐播放放置在service里面, 应该不会出现卡顿的现象吧.
音乐播放我是放在service里面的,如果在播放,service就每隔一秒把播放进度发到activity。[/quote] 我这是用取的, 不是推的, 每隔一秒获取一次播放进度. 在handlr里面直接调用mHandle.sendEmputyMessagetoDelay("", 1000); 试一下看看呢.[/quote] 还是卡。。能不能麻烦贴下你这部分的代码。。[/quote] MediaPlayActivity private Handler mHandler = new Handler(); private Runnable mVideoTimesChanged = new Runnable() { @Override public void run() { // TODO Auto-generated method stub mVideoController.setSeekBarPosition(mVideoView.getCurrentPosition()); mHandler.postDelayed(mVideoTimesChanged, 1000); } }; mVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mediaPlayer) { mHandler.postDelayed(mVideoTimesChanged, 1000); } }); MediaPlayController public void setSeekBarPosition(long position) { if(mStartTime != null && mSeekBar != null) { mSeekBar.setProgress((int) position); } } 大体就是这个结构, 不过的seekBar还有个监听, 是控制手势的.
  • 打赏
  • 举报
回复
引用 6 楼 lin_kin_p 的回复:
[quote=引用 5 楼 yuan514168845 的回复:] 2楼的方法正确,只不过把duration设置小一点,这样就会在很短的时候回调,seekbar就不会出现卡顿的现象
我贴部分代码帮我看看吧,还是会顿卡。
public void onReceive(Context context, Intent intent) {
            int progress;
            if ((progress = intent.getIntExtra("Progress", -1)) > 0) {
                mCurrent = progress;
                mHandler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        mSeekBar.setProgress(mCurrent);
                    }
                },100);
//                handler.sendMessageDelayed(msg,100);

            }
        }
如果正在播放,service那边就每隔一秒把进度发过来,贴的是activity接受的代码。延迟的话我试了很多,都不行。 [/quote]我没有开启服务,我直接用的线程
  • 打赏
  • 举报
回复
引用 6 楼 lin_kin_p 的回复:
[quote=引用 5 楼 yuan514168845 的回复:] 2楼的方法正确,只不过把duration设置小一点,这样就会在很短的时候回调,seekbar就不会出现卡顿的现象
我贴部分代码帮我看看吧,还是会顿卡。
public void onReceive(Context context, Intent intent) {
            int progress;
            if ((progress = intent.getIntExtra("Progress", -1)) > 0) {
                mCurrent = progress;
                mHandler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        mSeekBar.setProgress(mCurrent);
                    }
                },100);
//                handler.sendMessageDelayed(msg,100);

            }
        }
如果正在播放,service那边就每隔一秒把进度发过来,贴的是activity接受的代码。延迟的话我试了很多,都不行。 [/quote]思路错了,这里不是让你在post里面操作UI。你可以在这里开启一个线程,让线程去去此时播放的位置,然后设置在seekbar中。
lin_kin_p 2015-12-04
  • 打赏
  • 举报
回复
引用 5 楼 yuan514168845 的回复:
2楼的方法正确,只不过把duration设置小一点,这样就会在很短的时候回调,seekbar就不会出现卡顿的现象
我贴部分代码帮我看看吧,还是会顿卡。
public void onReceive(Context context, Intent intent) {
            int progress;
            if ((progress = intent.getIntExtra("Progress", -1)) > 0) {
                mCurrent = progress;
                mHandler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        mSeekBar.setProgress(mCurrent);
                    }
                },100);
//                handler.sendMessageDelayed(msg,100);

            }
        }
如果正在播放,service那边就每隔一秒把进度发过来,贴的是activity接受的代码。延迟的话我试了很多,都不行。
lin_kin_p 2015-12-04
  • 打赏
  • 举报
回复
引用 13 楼 woshiyyshow 的回复:
更新进度条本身就是得在主线程里面进行的, 但是, 你音乐播放是在异步线程里面实现的, 你可以把音乐播放放置在service里面, 应该不会出现卡顿的现象吧.
音乐播放我是放在service里面的,如果在播放,service就每隔一秒把播放进度发到activity。
柒加伊 2015-12-04
  • 打赏
  • 举报
回复
更新进度条本身就是得在主线程里面进行的, 但是, 你音乐播放是在异步线程里面实现的, 你可以把音乐播放放置在service里面, 应该不会出现卡顿的现象吧.
lin_kin_p 2015-12-04
  • 打赏
  • 举报
回复
引用 7 楼 yuan514168845 的回复:
[quote=引用 6 楼 lin_kin_p 的回复:] [quote=引用 5 楼 yuan514168845 的回复:] 2楼的方法正确,只不过把duration设置小一点,这样就会在很短的时候回调,seekbar就不会出现卡顿的现象
我贴部分代码帮我看看吧,还是会顿卡。
public void onReceive(Context context, Intent intent) {
            int progress;
            if ((progress = intent.getIntExtra("Progress", -1)) > 0) {
                mCurrent = progress;
                mHandler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        mSeekBar.setProgress(mCurrent);
                    }
                },100);
//                handler.sendMessageDelayed(msg,100);

            }
        }
如果正在播放,service那边就每隔一秒把进度发过来,贴的是activity接受的代码。延迟的话我试了很多,都不行。 [/quote]思路错了,这里不是让你在post里面操作UI。你可以在这里开启一个线程,让线程去去此时播放的位置,然后设置在seekbar中。[/quote] 怎么感觉有点晕。。能不能贴个伪代码。。
lin_kin_p 2015-12-04
  • 打赏
  • 举报
回复
引用 9 楼 happyjie1988 的回复:
你说的卡顿是指进度跳动的不流畅还是指机器卡顿,播放音乐卡顿呢?
我把操作seekbar的代码屏蔽了就好了。
lin_kin_p 2015-12-04
  • 打赏
  • 举报
回复
引用 9 楼 happyjie1988 的回复:
你说的卡顿是指进度跳动的不流畅还是指机器卡顿,播放音乐卡顿呢?
音乐卡顿一下。。
  • 打赏
  • 举报
回复
你说的卡顿是指进度跳动的不流畅还是指机器卡顿,播放音乐卡顿呢?
lin_kin_p 2015-12-03
  • 打赏
  • 举报
回复
引用 1 楼 woshiyyshow 的回复:
使用Handle.postDelay("", 1000); 试一试
我试了好几种办法了 。。还是会卡顿一下。
  • 打赏
  • 举报
回复
2楼的方法正确,只不过把duration设置小一点,这样就会在很短的时候回调,seekbar就不会出现卡顿的现象
柒加伊 2015-12-03
  • 打赏
  • 举报
回复
使用Handle.postDelay("", 1000); 试一试
daydreary 2015-12-03
  • 打赏
  • 举报
回复
EventBus, 或者绑定service,然后用handler发延时消息去取进度
lin_kin_p 2015-12-03
  • 打赏
  • 举报
回复
有没有老司机指点下啊

80,471

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧