流浪在黑洞

导航

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的程序都可以使用这个办法。

posted on 2012-08-28 10:01  Dontey  阅读(1865)  评论(0编辑  收藏  举报