handler问题
来源:4-5 MediaPlayer媒体播放

不一定要有昵称
2019-11-21
老师,这边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); } }
不过一般的播放器会有循环播放的逻辑,不会让用户处于无歌曲的状态的,除非用户手动暂停或者关闭。
20 -
刘某人
2019-11-21
mHandler.removeMessages(H_PROGRESS);
mHandler.removeCallbacksAndMessages(null);
两个都是可以的,前者是清除进度的Message 后者 是 清除这个Handler的所有消息和Callback。
032019-11-21
相似问题