Android音乐播放器进度条刷新机制
Android内置的Music播放器是通过aid接口, IMediaPlaybackService调用Remote Service在后台播放音乐,MediaPlaybackActivity中SeekBar控件读取IMediaPlaybackService的播放进度,刷新SeekBar的当前位置。通常情况下,开启一个新的线程,然后不断地读取IMediaPlaybackService的当前播放进度,然后通过Handler+Message通知UI线程刷新SeekBar。
Android内置Music播放器采取一个巧妙的办法,利用Handler的 sendMessageDelayed(Message msg, long delayMillis)方法,延迟发送修改UI的message,实现在UI主线程发送一个message来通知自己在n毫秒后刷新UI。这样可以节省一个线程的资源。
其中的next长整型就是下次刷新的间隔, queueNextRefresh用来发送message
private final Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { ... case REFRESH: long next = refreshNow(); queueNextRefresh(next); break; ... default: break; } } };
在Activity中发送message:
private void queueNextRefresh(long delay) { if (!paused) { Message msg = mHandler.obtainMessage(REFRESH); mHandler.removeMessages(REFRESH); mHandler.sendMessageDelayed(msg, delay); } }
很好很强大的代码,音视频播放器,或者其他需要频繁刷新ui的程序都可以使用这个办法。