Android的 CountDownTimer的使用

来源:互联网 发布:软件停止工作怎么办 编辑:程序博客网 时间:2024/06/06 09:47

说道计时器,可能是因为从java出门的。所以一直使用的都是java的timer类以及配套的timertask类,今天逛逛博客,看到了CountDownTimer这个类,照例搜索了一番,然发现他是Android封装好的一个计时的类,既然人家都封好了,使用起来肯定比timer的使用还要简单。所以做了一个简单的demo。,发现特别简单,接下来上他的用法

    TextView textView;
    CountDownTimer countdowntimer;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    textView=(TextView) this.findViewById(R.id.textView1);
    countdowntimer=new CountDownTimer(10000,1000) {
        
        @Override
        public void onTick(long millisUntilFinished) {
textView.setText(millisUntilFinished+"");
            
        }
        
        @Override
        public void onFinish() {
textView.setText("finish");            
        }
    };
    countdowntimer.start();
    }

    
}

代码比较简单,其中的参数

第一个为总时间,比如3000,,

第二个 间隔时间,比如1000

然后开始看看源码。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

    public CountDownTimer(long millisInFuture, long countDownInterval) {
        mMillisInFuture = millisInFuture;
        mCountdownInterval = countDownInterval;
    }

这个就是构造方法了,比较简单,而且他也只有这个构造方法

    public synchronized final void cancel() {
        mCancelled = true;
        mHandler.removeMessages(MSG);
    }

然后再这个cancel类中可以看到他是通过handler去操作的,好吧,凡事离不开handler

    private Handler mHandler = new Handler() {

        @Override
        public void handleMessage(Message msg) {

            synchronized (CountDownTimer.this) {
                if (mCancelled) {
                    return;
                }

                final long millisLeft = mStopTimeInFuture - SystemClock.elapsedRealtime();

                if (millisLeft <= 0) {
                    onFinish();
                } else if (millisLeft < mCountdownInterval) {

                    sendMessageDelayed(obtainMessage(MSG), millisLeft);
                } else {
                    long lastTickStart = SystemClock.elapsedRealtime();
                    onTick(millisLeft);


                    long delay = lastTickStart + mCountdownInterval - SystemClock.elapsedRealtime();



                    while (delay < 0) delay += mCountdownInterval;

                    sendMessageDelayed(obtainMessage(MSG), delay);
                }
            }
        }
    };

这个是handler里的操作,看得出来。

1。必须是锁定的,这样就不会照成混乱。

2.对long型数据的操作,然后就没没了,所以还是很简单的,

对了,最后提醒,要启动时既得是用start方法

0 0