重慶分公司,新征程啟航
為企業(yè)提供網站建設、域名注冊、服務器等服務
為企業(yè)提供網站建設、域名注冊、服務器等服務
在開發(fā)倒計時功能時往往我們會為了方便直接使用CountDownTimer或者使用Handler做延時來實現(xiàn),當然CountDownTimer內部封裝也是使用的Handler。
創(chuàng)新互聯(lián)堅持“要么做到,要么別承諾”的工作理念,服務領域包括:成都網站設計、成都做網站、企業(yè)官網、英文網站、手機端網站、網站推廣等服務,滿足客戶于互聯(lián)網時代的新豐網站設計、移動媒體設計的需求,幫助企業(yè)找到有效的互聯(lián)網解決方案。努力成為您成熟可靠的網絡建設合作伙伴!
如果只是做次數(shù)很少的倒計時或者不需要精確的倒計時邏輯那倒沒關系,比如說我只要倒計時10秒,或者我大概5分鐘請求某個接口
但是如果是需要做精確的倒計時操作,比如說手機發(fā)送驗證碼60秒,那使用現(xiàn)有的倒計時方案就會存在問題。可能有些朋友沒有注意到這一點,下面我們就來簡單分析一下現(xiàn)有倒計時的問題。
這個可能是用得最多的,因為方便嘛。但其實倒計時每一輪倒計時完之后都是存在誤差的,如果看過CountDownTimer的源碼你就會知道,他的內部是有做 校準操作 的。(源碼很簡單這里就不分析了)
但是如果你認真的測試過CountDownTimer,你就會發(fā)現(xiàn),即便它內部有做校準操作,他的沒一輪都是有偏差,只是他最后一次倒計時完之后的總共時間和開始倒計時的時間相比沒偏差。
什么意思呢,意思就是1秒,2.050秒,3.1秒......,這樣的每輪偏差,導致他會出現(xiàn)10.95秒,下一次12秒的情況,那它的回調中如果你直接做取整就會出現(xiàn)少一秒的情況,但實際是沒少的。
這只是其中的一個問題,你可以不根據它的回調做展示,自己用一個整形累加做展示也能解決。但是他還有個問題,有概率直接出現(xiàn)跳秒,就是比如3秒,下次直接5秒,這是實際的跳秒,是少了一次回調的那種。
跳秒導致你如果直接使用它可能會大問題,你可能自測的時候沒發(fā)現(xiàn),到時一上線應用在用戶那概率跳秒,那就蛋疼了。
不搞這么多花里胡哨的,直接使用Handler來實現(xiàn),會有什么問題。
因為直接使用handler來實現(xiàn),沒有校準操作,每次循環(huán)會出現(xiàn)幾毫秒的誤差,雖然比CountDownTimer的十幾毫秒的誤差要好, 但是在基數(shù)大的倒計時情況下誤差會累計,導致最終結果和現(xiàn)實時間差幾秒誤差,時間越久,誤差越大
直接使用Timer也一樣,只不過他每輪的誤差更小,幾輪才有1毫秒的誤差,但是沒有校準還是會出現(xiàn)誤差累計,時間越久誤差越大。
既然無法直接使用原生的,那我們就自己做一個。
我們基于Handler進行封裝,從上面可以看出主要為了解決兩個問題,時間校準和跳秒。自己寫一個CountDownTimer
思路就是在倒計時開始前獲取一次SystemClock.elapsedRealtime(),沒輪倒計時再獲取一次SystemClock.elapsedRealtime()相減得到誤差,根據delay校準。然后使用while循壞來處理跳秒的操作,與原生的CountDownTimer不同,這里如果跳了多少秒,就會返回多少次回調。
安卓實現(xiàn)同時多個倒計時效果的步驟:
我們首先需要在輸入框中輸入一個秒數(shù),比如:12,然后獲取輸入框中的值,顯示在一個TextView中;
點擊“開始倒計時”按鈕,每隔一秒鐘,秒數(shù)減1,然后顯示在TextView中;
點擊“停止倒計時”按鈕,計時器停止運行,當再次點擊“開始倒計時”按鈕,計時器繼續(xù)運行。
平時用的每個商品都應該有兩個屬性值,這里叫它deadLine和isOverdue吧,表示商品的到期時間和是否到期,那么倒計時可以考慮這么實現(xiàn):設置一個主計時器,每隔1秒發(fā)出消息告訴GridView現(xiàn)在的時間,GridView的Item獲得這個時間之后就和deadLine比較,如果已經到deadline了,就把數(shù)據源中的這項標記成已到期(修改isOverdue的值為true);沒到deadline,就計算還差多少時間,顯示到GridView的Item里。
你好,
首先需要在輸入框中輸入一個秒數(shù),比如:12,然后獲取輸入框中的值,顯示在一個TextView中;點擊“開始倒計時”按鈕,每隔一秒鐘,秒數(shù)減1,然后顯示在TextView中;點擊“停止倒計時”按鈕,計時器停止運行,當再次點擊“開始倒計時”按鈕,計時器繼續(xù)運行。