handler问题

来源:4-5 MediaPlayer媒体播放

不一定要有昵称

2019-11-21

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

写回答

2回答

刘某人

2019-11-21

播放器的逻辑是处于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
0

刘某人

2019-11-21

 mHandler.removeMessages(H_PROGRESS); 

 mHandler.removeCallbacksAndMessages(null);

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

0
3
不一定要有昵称
好的,谢谢啊
2019-11-21
共3条回复

聚焦市场开发热门技术 手把手带你开发商业级社交App

从零打造一款跟随灵魂的高性能社交App

559 学习 · 194 问题

查看课程