基于消息循环的定时器

概述

    Android定时器实现一般来说, 包括以下两种:

  • java.util.Timer
  • android.app.AlarmManager

    除此之外, 其实还有一种方式可以实现定时器的效果, 即利用消息循环的Handler来实现.


定时器

众所周知, Handler 可以发送延迟 Message/Runnable, 那么就可以利用其对应接口 handleMessage() / run() 来反复发送延迟消息, 既可实现定时器效果. 一旦不再定时操作了, 调用 Handler.remove**() 就可以清除消息队列中的消息, 也就取消了定时操作.

值得注意的是, 整个定时器操作都是基于消息循环的, 如UI线程的消息循环.

/** package + import */

/** Timer */
public abstract class LiteTimer {
    private static final MSG_TIMER = 0x01;
    private final Handler mHandler;
    /*private*/ long mDelayedMillis = 2000;

    public LiteTimer () {
        mHandler = new TimerHanlder(this);
    }

    public void setDelayedMillis(long val) {
        mDelayedMillis = val;
    }

    public void start() {
        mHandler.sendEmptyMessageDelayed(MSG_TIMER, mDelayedMillis);
    }

    public void stop() {
        mHandler.removeMessages(MSG_TIMER);
    }

    protected abstract boolean onTime();

    private static class TimerHandler {
        private WeakReference<LiteTimer> mRef;

        TimerHandler(LiteTimer timer) {
            mRef = new WeakReference<LiteTimer>();
        }

        @Override
        public void handleMessage(Message msg) {
            LiteTimer timer = mRef.get();
            if (timer != null) {
                if (timer.onTime()) {
                    sendEmptyMessageDelayed(MSG_TIMER, timer.mDelayedMillis);
                }
            }
        }
    }
    
}




你可能感兴趣的:(android,timer,handler,定时器,looper)