強(qiáng)迫癥的研究——MediaPlayer播放進(jìn)度條的優(yōu)化

強(qiáng)迫癥的研究——MediaPlayer播放進(jìn)度條的優(yōu)化

如何做一個(gè)優(yōu)美座菠、流暢而且準(zhǔn)確的播放進(jìn)度條,也許很多人覺得很簡(jiǎn)單,但實(shí)際上劈愚,這個(gè)問題在大部分時(shí)間都被忽略了。

計(jì)時(shí)方式的比較

  • 計(jì)時(shí)方式——主線程中使用Handler

    -- 這種方式最簡(jiǎn)單闻妓,在主線程中通過handler.postDealyed(……, 1000)菌羽,并在onHandleMessage中繼續(xù)post消息,這樣就實(shí)現(xiàn)了每隔1000ms進(jìn)行一次消息循環(huán)由缆。

  • 計(jì)時(shí)方式——使用單獨(dú)計(jì)時(shí)線程

    -- 單獨(dú)創(chuàng)建一個(gè)計(jì)時(shí)線程注祖,每秒發(fā)出time tick事件,主線程通過該事件來更新進(jìn)度均唉。這種方式比較麻煩是晨,但是不麻煩怎么裝逼呢?

    如何高雅舔箭、準(zhǔn)確的實(shí)現(xiàn)

    對(duì)于Handler方式

  • 自身誤差

這種方式下罩缴,如果使用handler.postDealyed(……, 1000)方式來進(jìn)行每秒的計(jì)時(shí),是不準(zhǔn)確的层扶,是的箫章,有很大誤差,誤差的原因在于在你收到消息镜会,到你重新發(fā)出handler.postDealyed的時(shí)間檬寂,并不是瞬間完成的,這里面有很多邏輯處理的時(shí)間戳表,即使沒有邏輯處理的時(shí)間桶至,handler本身也是耗損性能的,所以消息并不可能按照理想的1000延遲來進(jìn)行發(fā)送匾旭,這就導(dǎo)致了誤差的累積镣屹。

  • 線程調(diào)度誤差

我們知道,當(dāng)音樂線程啟動(dòng)季率,到handler發(fā)出消息野瘦,這一段時(shí)間內(nèi),存在進(jìn)程調(diào)度或者其它邏輯的耗時(shí)操作,導(dǎo)致這兩個(gè)時(shí)間并不是同時(shí)發(fā)生的鞭光。所以吏廉,我們每次在post的時(shí)候,都需要對(duì)計(jì)時(shí)進(jìn)行下補(bǔ)償惰许,但是席覆,怎么做呢?

對(duì)于Handler方式的優(yōu)化

我們知道汹买,Android中有很多計(jì)時(shí)的控件佩伤,首先想到的是DigitalClock,結(jié)果發(fā)現(xiàn)已經(jīng)廢棄晦毙,好吧生巡,看被什么替換了,OK见妒,發(fā)現(xiàn)了TextClock孤荣,代碼多了不少,感覺更牛逼了须揣。我們直接看他是怎么處理這個(gè)問題的:

同樣是通過程序員的嗅覺找到這里:

    private final Runnable mTicker = new Runnable() {
        public void run() {
            onTimeChanged();

            long now = SystemClock.uptimeMillis();
            long next = now + (1000 - now % 1000);

            getHandler().postAtTime(mTicker, next);
        }
    };

哎呦盐股,有點(diǎn)意思,我們之前是通過postDelay來觸發(fā)消息事件的耻卡,但這里系統(tǒng)使用了postAtTime疯汁,這是為什么呢?很自然我們會(huì)想到前面兩行代碼卵酪,其實(shí)也不用想太多幌蚊,你代個(gè)值進(jìn)去試下就知道了,假如now取出來是1200溃卡,那么next = 1200 + (1000 - 1200 % 1000)也就是next= 2000霹肝。你看,雖然我們前一次本該在1000觸發(fā)的事件塑煎,被各種邏輯延遲到1200,那么如果你用postDelay臭蚁,這個(gè)延遲就被累積了最铁,但如果用這種方式,誤差就被補(bǔ)償了垮兑。

我們就叫他誤差補(bǔ)償算法吧~

對(duì)于單獨(dú)計(jì)時(shí)線程方式

對(duì)于單獨(dú)計(jì)時(shí)的線程冷尉,由于時(shí)間點(diǎn)的觸發(fā)事件和主線程已經(jīng)分開了,計(jì)時(shí)線程就不會(huì)受主線程邏輯的阻塞了系枪,所以雀哨,只要保證開始時(shí)對(duì)起始時(shí)間差進(jìn)行下同步就OK了。

對(duì)于單獨(dú)計(jì)時(shí)線程方式的優(yōu)化

其實(shí)對(duì)于單獨(dú)計(jì)時(shí)線程來說,已經(jīng)沒有什么好優(yōu)化的了雾棺,而且優(yōu)點(diǎn)還能再列舉不少:

  1. 計(jì)時(shí)邏輯與UI邏輯分離膊夹,方便拓展
  2. 計(jì)時(shí)準(zhǔn)確,可以將計(jì)時(shí)線程封裝捌浩,暴露接口放刨,方便拓展
  3. 解耦、裝逼

如果你還要再進(jìn)一步優(yōu)化的話尸饺,可以在計(jì)時(shí)的時(shí)候进统,使用時(shí)間差的方式來統(tǒng)計(jì),雖然沒什么亂用浪听。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末螟碎,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子迹栓,更是在濱河造成了極大的恐慌掉分,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件迈螟,死亡現(xiàn)場(chǎng)離奇詭異叉抡,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)答毫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門褥民,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人洗搂,你說我怎么就攤上這事消返。” “怎么了耘拇?”我有些...
    開封第一講書人閱讀 157,435評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵撵颊,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我惫叛,道長(zhǎng)倡勇,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,509評(píng)論 1 284
  • 正文 為了忘掉前任嘉涌,我火速辦了婚禮妻熊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘仑最。我一直安慰自己扔役,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,611評(píng)論 6 386
  • 文/花漫 我一把揭開白布警医。 她就那樣靜靜地躺著亿胸,像睡著了一般坯钦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上侈玄,一...
    開封第一講書人閱讀 49,837評(píng)論 1 290
  • 那天婉刀,我揣著相機(jī)與錄音,去河邊找鬼拗馒。 笑死路星,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的诱桂。 我是一名探鬼主播洋丐,決...
    沈念sama閱讀 38,987評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼挥等!你這毒婦竟也來了友绝?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,730評(píng)論 0 267
  • 序言:老撾萬榮一對(duì)情侶失蹤肝劲,失蹤者是張志新(化名)和其女友劉穎迁客,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體辞槐,經(jīng)...
    沈念sama閱讀 44,194評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡掷漱,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,525評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了榄檬。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片卜范。...
    茶點(diǎn)故事閱讀 38,664評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖鹿榜,靈堂內(nèi)的尸體忽然破棺而出海雪,到底是詐尸還是另有隱情,我是刑警寧澤舱殿,帶...
    沈念sama閱讀 34,334評(píng)論 4 330
  • 正文 年R本政府宣布奥裸,位于F島的核電站,受9級(jí)特大地震影響沪袭,放射性物質(zhì)發(fā)生泄漏湾宙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,944評(píng)論 3 313
  • 文/蒙蒙 一冈绊、第九天 我趴在偏房一處隱蔽的房頂上張望创倔。 院中可真熱鬧,春花似錦焚碌、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春鹃骂,著一層夾襖步出監(jiān)牢的瞬間台盯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工畏线, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留静盅,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,389評(píng)論 2 360
  • 正文 我出身青樓寝殴,卻偏偏與公主長(zhǎng)得像蒿叠,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蚣常,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,554評(píng)論 2 349

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,791評(píng)論 25 707
  • 第十章:Android的消息機(jī)制 Handler是Android消息機(jī)制的上層接口市咽,開發(fā)人員只需要與它交互即可,底...
    loneyzhou閱讀 661評(píng)論 0 1
  • 作為一個(gè)女生抵蚊,我想買房施绎,周圍的人一半會(huì)說一個(gè)女孩子,買什么房呀贞绳,將來找個(gè)有房的老公不就好了谷醉,干嘛給自己那么大壓...
    小饅頭0601閱讀 199評(píng)論 0 0
  • 我們?cè)跍?zhǔn)備中考體育項(xiàng)目時(shí),有時(shí)候不小心在訓(xùn)練的時(shí)候會(huì)受到損傷冈闭,這時(shí)我們應(yīng)該如何處理呢俱尼?下面介紹幾種方法。 1拒秘、肌肉...
    體育觀察閱讀 743評(píng)論 4 4
  • 原文:You Are Not a Software Engineer (Yet) PARAGRAPH3 **Con...
    WesterosDoge閱讀 331評(píng)論 0 0