关于避开轮询方法的方法

来源:互联网 发布:知乎 保银投资 编辑:程序博客网 时间:2024/05/17 18:02

我感觉这个题目并不是太准确,其实这篇博文主要就是想记录下来这种方法,感觉可以避开通过线程开启死循环来感知一个东西的状态。其实很简单,就是通过handler的sendEmptyMessageDelayed();方法来延迟发送消息,来达到定时更新UI的目的,如果知道的就可以略过下文了……。闲言少叙。


这段时间在做一个音乐播放器,其中有一个功能是显示当前播放的进度,是以00:00的方式显示的,但是在MediaPlay中并没有一个能监听当前进度改变的监听器,只有一个getCurrentPosition();来返回当前的时间进度。

第一个想到的方法就是开一个线程,然后再线程中开一个wihle循环,不停的获取时间,并sendHandler来更新这个TextView,但是总感觉这样做不靠谱,后来就开始发现手机屏幕就开始发烧了……找了很多帖子,无意间看到一个这样的方法:

通过handler的sendEmptyMessageDelayed()延迟发送一个消息来更新UI,然后再在handler中再次延迟发送,这样一直循环。


来源:http://www.cnblogs.com/dunning/archive/2012/08/28/2659778.html

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;            }        }    };


private void queueNextRefresh(long delay) {        if (!paused) {            Message msg = mHandler.obtainMessage(REFRESH);            mHandler.removeMessages(REFRESH);            mHandler.sendMessageDelayed(msg, delay);        }    }



0 0
原创粉丝点击