干货三:CountDownTimer倒计时工具类
生活随笔
收集整理的這篇文章主要介紹了
干货三:CountDownTimer倒计时工具类
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
概述
毫無疑問,我們先來看下官方文檔中給的介紹
CountDownTimer
官方定義如下:
Schedule a countdown until a time in the future, with regular
notifications on intervals along the way.
同時(shí)官方也給出了使用的demo:
構(gòu)造函數(shù) 方法 以及參數(shù)含義請(qǐng)參考官方文檔,已經(jīng)很明確的說明了,這里就不重復(fù)了~
Code
import android.os.Bundle; import android.os.CountDownTimer; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button;import com.turing.base.R;/*** 倒計(jì)時(shí)演示* <p/>* Android中有個(gè)countDownTimer類,* 從名字上就可以看出來,它的功能是記錄下載時(shí)間,* 將后臺(tái)線程的創(chuàng)建和Handler隊(duì)列封裝成為了一個(gè)方便的調(diào)用.* <p/>* CountDownTimer由系統(tǒng)提供,果斷拋棄了自己以前使用Handler更新UI的做法*/ public class CountDownActivity extends AppCompatActivity {private MyCountDownTimer mc;private Button countBtn;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_count_down);countBtn = (Button) findViewById(R.id.show);// 共計(jì)30S,1S調(diào)用一次onTickmc = new MyCountDownTimer(30000, 1000);mc.start();}public void oncancel(View view) {mc.cancel();}public void restart(View view) {mc.start();}/*** 自定義倒計(jì)時(shí)類*/class MyCountDownTimer extends CountDownTimer {/*** @param millisInFuture 表示以毫秒為單位 倒計(jì)時(shí)的總數(shù)* <p/>* 例如 millisInFuture=1000 表示1秒* @param countDownInterval 表示 間隔 多少微秒 調(diào)用一次 onTick 方法* <p/>* 例如: countDownInterval =1000 ;* 表示每1000毫秒調(diào)用一次onTick()*/public MyCountDownTimer(long millisInFuture, long countDownInterval) {super(millisInFuture, countDownInterval);}@Overridepublic void onTick(long millisUntilFinished) {countBtn.setText("倒計(jì)時(shí)(" + millisUntilFinished / 1000 + ")...");}@Overridepublic void onFinish() {countBtn.setText("done");}} }運(yùn)行圖
CountDownTimer源碼
/** Copyright (C) 2008 The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at** http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/package android.os;/*** Schedule a countdown until a time in the future, with* regular notifications on intervals along the way.** Example of showing a 30 second countdown in a text field:** <pre class="prettyprint">* new CountDownTimer(30000, 1000) {** public void onTick(long millisUntilFinished) {* mTextField.setText("seconds remaining: " + millisUntilFinished / 1000);* }** public void onFinish() {* mTextField.setText("done!");* }* }.start();* </pre>** The calls to {@link #onTick(long)} are synchronized to this object so that* one call to {@link #onTick(long)} won't ever occur before the previous* callback is complete. This is only relevant when the implementation of* {@link #onTick(long)} takes an amount of time to execute that is significant* compared to the countdown interval.*/ public abstract class CountDownTimer {/*** Millis since epoch when alarm should stop.*/private final long mMillisInFuture;/*** The interval in millis that the user receives callbacks*/private final long mCountdownInterval;private long mStopTimeInFuture;/*** boolean representing if the timer was cancelled*/private boolean mCancelled = false;/*** @param millisInFuture The number of millis in the future from the call* to {@link #start()} until the countdown is done and {@link #onFinish()}* is called.* @param countDownInterval The interval along the way to receive* {@link #onTick(long)} callbacks.*/public CountDownTimer(long millisInFuture, long countDownInterval) {mMillisInFuture = millisInFuture;mCountdownInterval = countDownInterval;}/*** Cancel the countdown.*/public synchronized final void cancel() {mCancelled = true;mHandler.removeMessages(MSG);}/*** Start the countdown.*/public synchronized final CountDownTimer start() {mCancelled = false;if (mMillisInFuture <= 0) {onFinish();return this;}mStopTimeInFuture = SystemClock.elapsedRealtime() + mMillisInFuture;mHandler.sendMessage(mHandler.obtainMessage(MSG));return this;}/*** Callback fired on regular interval.* @param millisUntilFinished The amount of time until finished.*/public abstract void onTick(long millisUntilFinished);/*** Callback fired when the time is up.*/public abstract void onFinish();private static final int MSG = 1;// handles counting downprivate Handler mHandler = new Handler() {@Overridepublic void handleMessage(Message msg) {synchronized (CountDownTimer.this) {if (mCancelled) {return;}final long millisLeft = mStopTimeInFuture - SystemClock.elapsedRealtime();if (millisLeft <= 0) {onFinish();} else if (millisLeft < mCountdownInterval) {// no tick, just delay until donesendMessageDelayed(obtainMessage(MSG), millisLeft);} else {long lastTickStart = SystemClock.elapsedRealtime();onTick(millisLeft);// take into account user's onTick taking time to executelong delay = lastTickStart + mCountdownInterval - SystemClock.elapsedRealtime();// special case: user's onTick took more than interval to// complete, skip to next intervalwhile (delay < 0) delay += mCountdownInterval;sendMessageDelayed(obtainMessage(MSG), delay);}}}}; }總結(jié)
以上是生活随笔為你收集整理的干货三:CountDownTimer倒计时工具类的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 干货二:微信SDK-分享初探-更新中
- 下一篇: Android各种各样的Drawable