關(guān)于 Android 中的時(shí)間——你需要知道這些

前言

在 Android 的開(kāi)發(fā)中我們經(jīng)常需要編寫(xiě)和 時(shí)間 有關(guān)的代碼,比如說(shuō):按鈕的“帕金森”誤觸、驗(yàn)證碼發(fā)送的計(jì)時(shí)器等等姊途;這時(shí)我們可能會(huì)根據(jù) System.currentTimeMillis() 去獲取兩次點(diǎn)擊按鈕的時(shí)間差以及自己編寫(xiě)定時(shí)器 Timmer 和 TimeTask 來(lái)解決上述的問(wèn)題兄一,但是稽物,這其實(shí)都是 Google 不推薦的鞋吉。

CountDownTimer

Android:老子本來(lái)就有倒計(jì)時(shí)器

下面舉一段代碼來(lái)示意——在一個(gè) TextView 中顯示發(fā)送驗(yàn)證碼 10s 的倒計(jì)時(shí)

private TextView vertifyView;
private CountDownTimer timer = new CountDownTimer(10000, 1000) {
    @Override
    public void onTick(long millisUntilFinished) {
        vertifyView.setText((millisUntilFinished / 1000) + "秒后可重發(fā)");
    }

    @Override
    public void onFinish() {
        vertifyView.setEnabled(true);
        vertifyView.setText("獲取驗(yàn)證碼");
    }
};

調(diào)用的時(shí)候很簡(jiǎn)單:timer.start();

最后說(shuō)明一下:CountDownTimer timer = new CountDownTimer(10000, 1000)中,第一個(gè)參數(shù)表示總時(shí)間励烦,第二個(gè)參數(shù)表示間隔時(shí)間谓着。意思就是每隔一秒會(huì)回調(diào)一次方法onTick,然后10秒之后會(huì)回調(diào)onFinish方法坛掠。

SystemClock

別只抓著 System.currentTimeMillis() 不放了

以下詳細(xì)介紹內(nèi)容來(lái)自紅黑聯(lián)盟

1.聲明

public final class SystemClock extends Object 是一個(gè)不可變類(lèi)赊锚。

2.結(jié)構(gòu)

java.lang.Object? android.os.SystemClock

3.概述

它是一個(gè)核心的技術(shù)設(shè)備。三種不同的時(shí)鐘是可用的屉栓,他們不應(yīng)該混淆:

  1. System.currentTimeMillis()是一個(gè)標(biāo)準(zhǔn)的“墻”時(shí)鐘(時(shí)間和日期)舷蒲,表示從紀(jì)元到現(xiàn)在的毫秒數(shù)。該墻時(shí)鐘能夠被用戶或電話網(wǎng)絡(luò)(見(jiàn)setCurrentTimeMillis(long))設(shè)置友多,所以該時(shí)間可能會(huì)向前或向后不可預(yù)知地跳越牲平。該時(shí)鐘應(yīng)該僅僅被使用在當(dāng)現(xiàn)實(shí)世界的對(duì)應(yīng)的日期和時(shí)間是重要的情況,例如一個(gè)日歷或鬧鐘應(yīng)用程序域滥。而間隔時(shí)間和經(jīng)過(guò)時(shí)間應(yīng)該使用不同的時(shí)鐘纵柿。如果你使用System.currentTimeMillis(),可以考慮監(jiān)聽(tīng)ACTION為ACTION_TIME_TICK启绰、ACTION_TIME_CHANGED昂儒、ACTION_TIMEZONE_CHANGED 的廣播去監(jiān)聽(tīng)時(shí)間變化。
  2. uptimeMillis()表示自系統(tǒng)啟動(dòng)時(shí)開(kāi)始計(jì)數(shù)委可,以毫秒為單位渊跋。返回的是從系統(tǒng)啟動(dòng)到現(xiàn)在這個(gè)過(guò)程中的處于非休眠期的時(shí)間。當(dāng)系統(tǒng)進(jìn)入深度睡眠時(shí)(CPU關(guān)閉着倾,設(shè)備變黑拾酝,等待外部輸入裝置)該時(shí)鐘會(huì)停止。但是該時(shí)鐘不會(huì)被時(shí)鐘調(diào)整屈呕,閑置或其他節(jié)能機(jī)所影響微宝。這是大多數(shù)間隔時(shí)間的基本點(diǎn),例如Thread.sleep(millls)虎眨、Object.wait(millis)和System.nanoTime()蟋软。該時(shí)鐘被保證是單調(diào)的镶摘,適用于檢測(cè)不包含休眠的間隔時(shí)間的情況。大多數(shù)的方法接受一個(gè)時(shí)間戳的值除了uptimeMillis()時(shí)鐘岳守。
  3. elapsedRealtime() and elapsedRealtimeNanos() 返回系統(tǒng)啟動(dòng)到現(xiàn)在的時(shí)間凄敢,包含設(shè)備深度休眠的時(shí)間。該時(shí)鐘被保證是單調(diào)的湿痢,即使CPU在省電模式下涝缝,該時(shí)間也會(huì)繼續(xù)計(jì)時(shí)。該時(shí)鐘可以被使用在當(dāng)測(cè)量時(shí)間間隔可能跨越系統(tǒng)睡眠的時(shí)間段譬重。

有幾種機(jī)制控制事件發(fā)生的時(shí)間:

  1. 標(biāo)準(zhǔn)的方法像Thread.sleep(millis) 和 Object.wait(millis)總是可用的拒逮,這些方法使用的是uptimeMillis()時(shí)鐘,如果設(shè)備進(jìn)入深度休眠臀规,剩余的時(shí)間將被推遲直到系統(tǒng)喚醒滩援。這些同步方法可能被Thread.interrupt()中斷,并且你必須處理InterruptedException異常塔嬉。
  2. SystemClock.sleep(millis)是一個(gè)類(lèi)似于Thread.sleep(millis)的實(shí)用方法玩徊,但是它忽略InterruptedException異常。使用該函數(shù)產(chǎn)生的延遲如果你不使用Thread.interrupt()谨究,因?yàn)樗鼤?huì)保存線程的中斷狀態(tài)恩袱。
  3. Handler可以在一個(gè)相對(duì)或者絕對(duì)的時(shí)間設(shè)置異步回調(diào),Handler類(lèi)對(duì)象也使用uptimeMillis()時(shí)鐘胶哲,而且需要一個(gè)loop(經(jīng)常出現(xiàn)在GUI程序中)畔塔。
  4. AlarmManager可以觸發(fā)一次或重復(fù)事件,即使設(shè)備深度休眠或者應(yīng)用程序沒(méi)有運(yùn)行纪吮。事件可以選擇用 currentTimeMillis或者elapsedRealtime()(ELAPSED_REALTIME)來(lái)設(shè)置時(shí)間俩檬,當(dāng)事件發(fā)生會(huì)觸發(fā)一個(gè)廣播。
4.方法
  1. public static long currentThreadTimeMillis () 返在當(dāng)前線程運(yùn)行的毫秒數(shù)碾盟。
  2. public static long elapsedRealtime () 返回系統(tǒng)啟動(dòng)到現(xiàn)在的毫秒數(shù)棚辽,包含休眠時(shí)間。
  3. public static long elapsedRealtimeNanos () 返回系統(tǒng)啟動(dòng)到現(xiàn)在的納秒數(shù)冰肴,包含休眠時(shí)間屈藐。
  4. public static boolean setCurrentTimeMillis (long millis) 設(shè)置當(dāng)前的"墻"時(shí)間,要求調(diào)用進(jìn)程有許可權(quán)限熙尉。返回是否成功联逻。
  5. public static void sleep (long ms) 等待給定的時(shí)間。和Thread.sleep(millis)類(lèi)似检痰,但是它不會(huì)拋出InterruptedException異常包归。事件被推遲到下一個(gè)中斷操作。該方法直到指定的時(shí)間過(guò)去才返回铅歼。
  6. public static long uptimeMillis () 返回系統(tǒng)啟動(dòng)到現(xiàn)在的毫秒數(shù)公壤,不包含休眠時(shí)間换可。就是說(shuō)統(tǒng)計(jì)系統(tǒng)啟動(dòng)到現(xiàn)在的非休眠期時(shí)間。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末厦幅,一起剝皮案震驚了整個(gè)濱河市沾鳄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌确憨,老刑警劉巖译荞,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異休弃,居然都是意外死亡吞歼,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)塔猾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)浆熔,“玉大人,你說(shuō)我怎么就攤上這事桥帆。” “怎么了慎皱?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵老虫,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我茫多,道長(zhǎng)祈匙,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任天揖,我火速辦了婚禮夺欲,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘今膊。我一直安慰自己些阅,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布斑唬。 她就那樣靜靜地躺著市埋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪恕刘。 梳的紋絲不亂的頭發(fā)上缤谎,一...
    開(kāi)封第一講書(shū)人閱讀 51,462評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音褐着,去河邊找鬼坷澡。 笑死,一個(gè)胖子當(dāng)著我的面吹牛含蓉,可吹牛的內(nèi)容都是我干的频敛。 我是一名探鬼主播项郊,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼姻政!你這毒婦竟也來(lái)了呆抑?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤汁展,失蹤者是張志新(化名)和其女友劉穎鹊碍,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體食绿,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡侈咕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了器紧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片耀销。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖铲汪,靈堂內(nèi)的尸體忽然破棺而出熊尉,到底是詐尸還是另有隱情,我是刑警寧澤掌腰,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布狰住,位于F島的核電站,受9級(jí)特大地震影響齿梁,放射性物質(zhì)發(fā)生泄漏催植。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一勺择、第九天 我趴在偏房一處隱蔽的房頂上張望创南。 院中可真熱鬧,春花似錦省核、人聲如沸稿辙。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)邓深。三九已至,卻和暖如春笔刹,著一層夾襖步出監(jiān)牢的瞬間芥备,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工舌菜, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留萌壳,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像袱瓮,于是被迫代替她去往敵國(guó)和親缤骨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

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

  • 原文出處:http://www.ccbu.cc/android/android-systemclock Class...
    ccbuluo閱讀 1,659評(píng)論 0 0
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理尺借,服務(wù)發(fā)現(xiàn)绊起,斷路器,智...
    卡卡羅2017閱讀 134,656評(píng)論 18 139
  • 最近項(xiàng)目中遇到一個(gè)上報(bào)時(shí)間錯(cuò)誤的問(wèn)題燎斩。查了一段時(shí)間虱歪,中間一度懷疑是否是用戶修改時(shí)間造成的計(jì)算錯(cuò)誤。然后就了解了一下...
    于曉飛93閱讀 16,659評(píng)論 2 28
  • Android Handler機(jī)制系列文章整體內(nèi)容如下: Android Handler機(jī)制1之ThreadAnd...
    隔壁老李頭閱讀 5,688評(píng)論 4 5
  • 譯注:這是一篇在Stack overflow上很熱的帖子栅表。提問(wèn)者自稱(chēng)已經(jīng)掌握了有關(guān)Python OOP編程中的各種...
    LazzMan閱讀 600評(píng)論 0 1