成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

把倒計時做到極致

開發 開發工具
倒計時這種,每秒更新 UI 的需求,應該算是比較常見的了。最常見的場景,就是驗證碼發送超時重試的邏輯,這個邏輯中需要一個倒計時的邏輯去每秒修改 UI ,讓倒計時做到用戶可感知。

[[197506]]

 一、前言

倒計時這種,每秒更新 UI 的需求,應該算是比較常見的了。最常見的場景,就是驗證碼發送超時重試的邏輯,這個邏輯中需要一個倒計時的邏輯去每秒修改 UI ,讓倒計時做到用戶可感知。

那么倒計時的邏輯,需要如何做到***?

一個倒計時,最少要有兩個要求:準、穩。

準就是說,一個 2 分鐘的倒計時,就應該執行兩分鐘,穩的意思就是說,每次同步 UI 的更新,都是差不多間隔 1s。

二、實現思路

1、每次延遲 1s 通知 UI 更新

倒計時說白了就是一個間隔固定時間去做一件固定任務,這樣的功能,最簡單的就是使用 Handler.postDelayed() 去間隔執行。

那么我們寫一個 CountdownUtils 的類,先看看它的結構。

可以看到,它是基于一個 Handler 來做延遲的。這個邏輯非常的簡單,直接上代碼了。

使用起來也非常的簡單,傳遞進去 2 分鐘的時長。

  1. new CountdownUtils(120).start() 

看看 Log 輸出的結果,

從 Log 上看,確實是完成了一個倒計時的功能,一秒一秒一直到 0 ,但是這里為了觀察準不準,對倒計時執行的完整時間做了一個間隔記錄,看到問題了嗎?一個 120s 的倒計時,卻執行了124s 左右。

這個問題實際上是因為 Handler.postDelayed() 的間隔時長,并不是準確的間隔指定的時長,具體什么時候執行,實際上是看線程的調度的。這種總時長差異的問題,換了 Timer 什么的去實現也是無法解決的。

這個問題,在一些驗證碼倒計時的場景下,沒有參照事件點,每個倒計時,誤差幾十毫秒,基本上是用戶無感知的。但是有一些情況下,例如視頻播放的倒計時,這種有參照的情況下,幾分鐘的倒計時,誤差幾秒鐘,就是非常明顯的 Bug 了。

這就是不穩,那么,如何把倒計時做的穩呢?

2、 使用 CountDownTimer

實現一個倒計時, Android 其實是提供了對應的支持類的,那就是 CounDownTimer ,它處于 android.os 包下的,完全可以實現一個倒計時的邏輯。

我們先看看它是如何使用的。

CountDownTimer 的使用非常的簡單,在 onTick() 中監聽倒計時的變化,結束的時候會去調用 onFinish()。

繼續運行一下看看 Log 的輸出情況。

這個總時長,誤差已經是毫秒級的了,看樣子比我們自己實現的好很多。

再仔細看看,onTick() 方法回調的參數,是一個 毫秒 為單位的數值,而這個數值,其實是有誤差的,但是這個其實也不影響,只需要對其進行四舍五入的運算,就可以得到正確的倒計時秒數。

例如:2830 就是 3s,1828 就是 2s。

但是再仔細看看,就能發現問題,如果使用這種方式來處理倒計時的話,你會發現,拿不到 1s 的狀態,會直接 3s - 2s - finish,這個問題,從 Log 上也可以反應出來。

這就很尷尬了,有沒有參照物,都是一個 Bug,只能先看看 CountDownTimer 的源碼了,它是如何保證總時長的準確的。

 

從 CountDownTimer 的結構可以看出,它實際上也是使用 mHandler 來做的延遲,繼續看最重要的 Handler 的實現代碼。

 

在 handleMessage() 中,用到了一個 SystemClock.elapsedRealtime() ,它實際上獲取到的是一個 系統 啟動之后,到現在的一個絕對時間,包含系統休眠的間隔。

 

但是,它并不是關鍵,關鍵在于,CountDownTimer 會使用這個時間,每次計算出一個相對 1s 間隔的差值,也就是說,每次都去糾正這個誤差值,來保證最終的總時長誤差是毫秒級(其實就是***一次 postDelayed() 的誤差)。

既然找到了 CountDownTimer 保證時間準確行的關鍵點,那么我們可以改寫***個 Demo 的代碼,來解決沒有 1s 狀態的問題。

3、 動態計算 delay 值

沒什么好說的,就是計算此次間隔耗時,然后比 1s 多出來的毫秒值,從下一個 1s 中減去,來糾正間隔時長。

 

既然實現了之后,我們再看看輸出的 Log。

 

可以看到,interval 每一次都在動態的調整,每一秒的狀態都會更新出去,并且總時長也保證誤差在毫秒級的,基本上***解決了倒計時的問題了。

三、小結

一個倒計時,簡簡單單使用 Handler.postDelayed() 也是無法保證準和穩的。細節決定成敗,一個倒計時也是可以做到***的。

【本文為51CTO專欄作者“張旸”的原創稿件,轉載請通過微信公眾號聯系作者獲取授權】

戳這里,看該作者更多好文

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2022-10-21 15:42:21

倒計時鴻蒙

2011-04-11 09:17:28

Ubuntu倒計時

2015-03-23 17:58:04

驗證碼倒計時并行

2014-03-21 13:46:45

2014-08-18 14:30:27

Android倒計時

2014-02-18 10:36:33

2011-04-11 09:50:56

Ubuntu 11.0

2013-10-10 09:23:15

Android 4.4Kitkat

2013-04-09 10:01:18

微軟Windows XP

2019-12-13 19:37:00

BashLinux命令

2020-10-28 17:54:49

成都信息安全

2022-06-14 08:45:27

瀏覽器IEWindows

2013-10-08 09:24:39

Windows 8.1Windows 8

2019-11-22 11:54:04

數字時代數字中國數字產業

2013-06-06 11:27:52

iRadioWWDC2013

2017-02-09 16:35:17

戴爾

2021-11-26 00:00:13

AndroidCountDownTi控件

2025-03-14 00:00:00

2012-12-28 13:50:00

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品国产一区二区国模嫣然 | 91视频a | 国产综合精品一区二区三区 | 精品日韩一区 | 日韩精品视频在线观看一区二区三区 | 91在线视频观看 | 玖玖免费 | 日韩精品成人一区二区三区视频 | 国产精品日本一区二区在线播放 | 福利视频1000| 国产日韩一区二区 | 亚洲欧美中文日韩在线v日本 | 香蕉视频一区二区 | 伊人色综合久久久天天蜜桃 | 三级视频国产 | 福利在线看 | 精品国产欧美日韩不卡在线观看 | 日韩一级电影免费观看 | 久久久精品视频免费 | 日韩欧美亚洲 | 欧美一区二区三区在线观看 | 中文字幕日韩欧美一区二区三区 | 在线视频中文字幕 | 欧美精品一区二区免费视频 | 国产精品日韩欧美 | 亚洲精品视频二区 | 日韩亚洲一区二区 | 日韩精品久久久久 | 国产成人精品999在线观看 | 一区二区三区四区电影视频在线观看 | 国产精品毛片一区二区在线看 | 欧美影院久久 | 国产精品久久久久久亚洲调教 | 天天躁日日躁性色aⅴ电影 免费在线观看成年人视频 国产欧美精品 | 亚洲一区二区三区高清 | 国产免费av在线 | 亚洲在线一区二区 | 亚洲网站在线观看 | 日本三级在线 | 国产美女黄色 | 看片wwwwwwwwwww |