请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

handler问题

老师,这边handler用的方式有问题吧?播放停止或者暂停了,handler还是在不停的处理onProgress , 播放完成了日志还在不停的输出 。
我觉得应该将 mHandler.removeMessages(H_PROGRESS); 改为 mHandler.removeCallbacksAndMessages(null);

正在回答

2回答

播放器的逻辑是处于play的时候则启动Handler进行进度的读取,当处于pause或者stop的时候则将handler的message给remove掉,如下代码:

/**
 * 暂停播放
 */
public void pausePlay() {
    if (isPlaying()) {
        mMediaPlayer.pause();
        MEDIA_STATUS = MEDIA_STATUS_PAUSE;
        mHandler.removeMessages(H_PROGRESS); //这行
    }
}

/**
 * 停止播放
 */
public void stopPlay() {
    mMediaPlayer.stop();
    MEDIA_STATUS = MEDIA_STATUS_STOP;
    mHandler.removeMessages(H_PROGRESS); //这行
}

handler已经被remove掉,onProgress则不会走,这是正常的逻辑。

但是有一种情况,也就是你所说的情况,我看了下代码,确实是我疏忽了的逻辑

播放完成之后,走的是OnComplteionListener这个监听,实际上并没有调用stop方法,所以onProgress才会一直走,你可以在播放结束并且没有后续的歌曲播放的时候进行手动的关闭,如:

/**
 * 无歌曲不需要监听进度
 */
public void removeHandler() {
    if (mHandler != null) {
        mHandler.removeMessages(H_PROGRESS);
    }
}

不过一般的播放器会有循环播放的逻辑,不会让用户处于无歌曲的状态的,除非用户手动暂停或者关闭。

2 回复 有任何疑惑可以回复我~
刘某人 2019-11-21 14:38:26

 mHandler.removeMessages(H_PROGRESS); 

 mHandler.removeCallbacksAndMessages(null);

两个都是可以的,前者是清除进度的Message 后者 是 清除这个Handler的所有消息和Callback。

0 回复 有任何疑惑可以回复我~
  • 提问者 不一定要有昵称 #1
    老师,这两个有什么区别吗?
    mHandler.removeMessages(H_PROGRESS);和mHandler.removeCallbacksAndMessages(null);
    回复 有任何疑惑可以回复我~ 2019-11-21 14:47:18
  • 刘某人 回复 提问者 不一定要有昵称 #2
    //清除指定的消息
     mHandler.removeMessages(H_PROGRESS); 
    //清除这个Handler所有的消息和回调
     mHandler.removeCallbacksAndMessages(null);
    回复 有任何疑惑可以回复我~ 2019-11-21 14:54:03
  • 提问者 不一定要有昵称 #3
    好的,谢谢啊
    回复 有任何疑惑可以回复我~ 2019-11-21 14:54:12
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号