Android CountDownTimer 倒計(jì)時(shí)器的簡(jiǎn)單使用

概述

在Android應(yīng)用中幾乎都能看到,閃屏頁(yè)或者歡迎頁(yè)右上角有一個(gè) “倒計(jì)時(shí) + 跳過” 的功能航夺,還有就是獲得驗(yàn)證碼的倒計(jì)時(shí)功能,有些人會(huì)想到延遲的實(shí)現(xiàn)方式金吗,在這里通過實(shí)用Android封裝好的類 CountDownTimer 就能輕松實(shí)現(xiàn)懒构,其內(nèi)部原理就是通過Handler機(jī)制實(shí)現(xiàn)的餐济。

效果圖

待提交

CountDownTimer 介紹

  • CountDownTimer 直接 new 出來(lái)使用,其構(gòu)造函數(shù)
public CountDownTimer(long millisInFuture, long countDownInterval) {  
    mMillisInFuture = millisInFuture;  
    mCountdownInterval = countDownInterval;  
} 

1.參數(shù) - millisInFuture:設(shè)置倒計(jì)時(shí)的總時(shí)間(毫秒)
2.參數(shù) - countDownInterval:設(shè)置每次減去的時(shí)間(毫秒)

  • 方法
public final void cancel ()  
  
public abstract void onFinish ()  
  
public abstract void onTick (long millisUntilFinished)  
  
public final CountDownTimer start () 

1.cancel() 取消當(dāng)前任務(wù)
2.onFinish() 當(dāng)前任務(wù)完成的時(shí)候調(diào)用
3.onTick(long millisUntilFinished) 當(dāng)前任務(wù)每完成一次倒計(jì)時(shí)間隔時(shí)間時(shí)回調(diào)
4.start() 開始當(dāng)前的任務(wù)
注:調(diào)用時(shí)注意start() 方法的調(diào)用胆剧,要不倒計(jì)時(shí)是不起作用的絮姆。。

案例

public class ZpTimerActivity extends Activity {  
  
    private CountDownTimer mTimer;  
  
    @Override  
    protected void onCreate(@Nullable Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
  
        setContentView(R.layout.activity_timer);  
        initView();  
    }  
  
    private void initView() {  
        if (mTimer == null) {  
            mTimer = new CountDownTimer((long) (5 * 1000), 1000) {  
  
                @Override  
                public void onTick(long millisUntilFinished) {  
                    if (!ZpTimerActivity.this.isFinishing()) {  
                        int remainTime = (int) (millisUntilFinished / 1000L);  
                        Log.e("zpan","======remainTime=====" + remainTime);  
                    }  
                }  
  
                @Override  
                public void onFinish() {  
                    Log.e("zpan","======onFinish=====");  
                }  
            };  
            mTimer.start();  
        }  
    }  
  
    @Override  
    protected void onDestroy() {  
        super.onDestroy();  
        if (mTimer != null) {  
            mTimer.cancel();  
            mTimer = null;  
        }  
    }  
}  

Log

12-06 16:31:17.809 20276-20276/com.example.zpdemo E/zpan: ======remainTime=====4  
12-06 16:31:18.811 20276-20276/com.example.zpdemo E/zpan: ======remainTime=====3  
12-06 16:31:19.812 20276-20276/com.example.zpdemo E/zpan: ======remainTime=====2  
12-06 16:31:20.813 20276-20276/com.example.zpdemo E/zpan: ======remainTime=====1  
12-06 16:31:22.769 20276-20276/com.example.zpdemo E/zpan: ======onFinish=====  

踩過的坑

在某些場(chǎng)景下秩霍,CountDownTimer 會(huì)導(dǎo)致空指針篙悯,也有可能造成內(nèi)存泄漏。
如果在Activity或者Fragment被回收時(shí)并未調(diào)用CountDownTimer的cancel()方法結(jié)束自己铃绒,這個(gè)時(shí)候CountDownTimer的Handler方法中如果判斷到當(dāng)前的時(shí)間未走完鸽照,那么會(huì)繼續(xù)調(diào)用onTick方法,Activity或者Fragment已經(jīng)被系統(tǒng)回收颠悬,從而里面的變量被設(shè)置為Null矮燎,同時(shí),CountDownTimer中的Handler方法還在繼續(xù)執(zhí)行赔癌,這一塊空間始終無(wú)法被系統(tǒng)回收也就造成了內(nèi)存泄漏诞外。

  • 在CountDownTimer的onTick方法中記得對(duì)當(dāng)前對(duì)象做判空處理
    activity
if(!activity.isFinishing()){  
        // TODO  
}

fragment

if(getActivity()!=null){  
      // TODO  
}  
  • 在和Dialog結(jié)合使用的時(shí)候,在onFinish()方法調(diào)用 dismiss()方法讓彈框消失灾票,要判斷getFragmentManager是否為空
@Override  
public void onFinish() {  
    if(getFragmentManager()!=null){  
        dismiss();  
    }  
} 
  • 在使用CountDownTimer時(shí)峡谊,在Activity或fragment生命周期結(jié)束時(shí),調(diào)用timer.cancle()方法
@Override  
protected void onDestroy() {  
    super.onDestroy();  
    if (mTimer != null) {  
        mTimer.cancel();  
        mTimer = null;  
    }  
} 
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末刊苍,一起剝皮案震驚了整個(gè)濱河市靖苇,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌班缰,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件悼枢,死亡現(xiàn)場(chǎng)離奇詭異埠忘,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)馒索,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門莹妒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人绰上,你說(shuō)我怎么就攤上這事旨怠。” “怎么了蜈块?”我有些...
    開封第一講書人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵鉴腻,是天一觀的道長(zhǎng)迷扇。 經(jīng)常有香客問我,道長(zhǎng)爽哎,這世上最難降的妖魔是什么蜓席? 我笑而不...
    開封第一講書人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮课锌,結(jié)果婚禮上厨内,老公的妹妹穿的比我還像新娘。我一直安慰自己渺贤,他們只是感情好雏胃,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著志鞍,像睡著了一般瞭亮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上述雾,一...
    開封第一講書人閱讀 52,457評(píng)論 1 311
  • 那天街州,我揣著相機(jī)與錄音,去河邊找鬼玻孟。 笑死唆缴,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的黍翎。 我是一名探鬼主播面徽,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼匣掸!你這毒婦竟也來(lái)了趟紊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤碰酝,失蹤者是張志新(化名)和其女友劉穎霎匈,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體送爸,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡铛嘱,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了袭厂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片墨吓。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖纹磺,靈堂內(nèi)的尸體忽然破棺而出帖烘,到底是詐尸還是另有隱情,我是刑警寧澤橄杨,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布秘症,位于F島的核電站照卦,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏历极。R本人自食惡果不足惜窄瘟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望趟卸。 院中可真熱鬧蹄葱,春花似錦、人聲如沸锄列。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)邻邮。三九已至竣况,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間筒严,已是汗流浹背丹泉。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鸭蛙,地道東北人摹恨。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像娶视,于是被迫代替她去往敵國(guó)和親晒哄。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

推薦閱讀更多精彩內(nèi)容