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

Android中消息隊列延時不準確的原因,從系統時鐘的精度到MessageQueue的機制

移動開發 Android
從系統時鐘看已經過去1個小時了,但是計算now時因為uptimeMillis不包含休眠時的時間。如果now < msg.when 會判定Messsage還沒有到執行時間,就不會從MessageQueue中取出并執行。

SystemClock系統時鐘

SystemClock類是一個用于獲取時間信息的核心類,為Android開發者提供了多種與時間相關的功能。

  1. 「類聲明和結構」:

SystemClock是一個final類,繼承自Object,不能被繼承。

不可變類,提供了與時間相關的多種方法。

  1. 「主要方法」:

SystemClock.uptimeMillis():

返回從系統啟動開始到現在的非休眠時間的毫秒數。

當系統進入深度睡眠(CPU休眠、屏幕休眠、設備等待外部輸入)時,該時間停止。

SystemClock.elapsedRealtime() 和 SystemClock.elapsedRealtimeNanos():

返回從系統啟動到現在的總時間,包括深度睡眠的時間。

兩個方法返回的時間都是單調的,即使在省電模式下也會繼續計時。

SystemClock.sleep(long):

類似于Thread.sleep(long),忽略了InterruptedException異常。

SystemClock.setCurrentTimeMillis(long):

「注意」:通常用于設置系統時間,需要系統權限。

將系統時間設置為指定的毫秒數,通常只在系統源碼環境下使用,并且需要特定的編譯和簽名過程。

  1. 「其他注意事項」:

監聽時間變化:

通過監聽ACTION_TIME_TICK、ACTION_TIME_CHANGED和ACTION_TIMEZONE_CHANGED等廣播,可以獲取系統時間是否發生改變。

  1. 「權限要求」:

修改系統時間(如使用SystemClock.setCurrentTimeMillis(long))需要系統權限,應用需要在Android系統源碼環境下進行編譯和簽名。

Hander延時消息延時會不準確

Hanler中發送消息(或者延時消息) 是通過SystemClock.uptimeMillis()為基準計算。

MessageQueue入隊列時,計算Message.when以SystemClock.uptimeMillis()時間為基準。

public final boolean sendMessageDelayed(@NonNull Message msg, long delayMillis) {
    if (delayMillis < 0) {
        delayMillis = 0;
    }
    return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis);
}

從MessageQueue中消費Message,判斷Message是否到了執行時間,也是以SystemClock.uptimeMillis()為基準。

//Looper.loop()循環
public static void loop() {
    for (;;) {
        Message msg = queue.next(); // might block
        msg.target.dispatchMessage(msg);
    }
}

//MessageQueue類的next方法
//msg.when > now時 才會將Message取出然后執行。
Message next() {
    for (;;) {
        ...
        synchronized (this) {
            // (1)計算當前時間
            final long now = SystemClock.uptimeMillis();
        
            // 返回取到的Message 
            if (msg != null) {
                //msg尚未到達觸發時間,則計算新的阻塞超時時間nextPollTimeoutMillis,下次循環觸發隊列阻塞
                if (now < msg.when) {
                    // Next message is not ready.  Set a timeout to wake up when it is ready.
                    nextPollTimeoutMillis = (int) Math.min(msg.when - now, Integer.MAX_VALUE);
                } else {
                    //從鏈表中移除該消息后,直接返回
                    // Got a message.
                    mBlocked = false;
                    if (prevMsg != null) {
                        prevMsg.next = msg.next;
                    } else {
                        mMessages = msg.next;
                    }
                    msg.next = null;
                    msg.markInUse();
                    return msg;
                }
            } 
            ...
    }
}

SystemClock.uptimeMillis()計算系統從開機到現在的時間,單位是毫秒。但是它不包括系統休眠的時間(cpu休眠、屏幕休眠等)。

當手機滅屏處于休眠狀態的時間是不計算進SystemClock.uptimeMillis(),比如發送一個延時20分鐘的Message消息,系統息屏后進入了深度睡眠(假設深度睡眠了1個小時),當進程蘇醒后,這一個小時的時間是不計入(1)中的now。

final long now = SystemClock.uptimeMillis();

從系統時鐘看已經過去1個小時了,但是計算now時因為uptimeMillis不包含休眠時的時間。如果now < msg.when 會判定Messsage還沒有到執行時間,就不會從MessageQueue中取出并執行。

責任編輯:武曉燕 來源: 沐雨花飛蝶
相關推薦

2010-03-26 14:43:09

CentOS系統

2009-10-12 13:57:35

VMware虛擬機時鐘

2024-10-16 15:11:58

消息隊列系統設計

2021-03-11 06:01:41

Linux消息隊列

2009-08-06 16:17:05

點對點消息隊列

2020-09-27 07:44:08

RabbitMQ投遞消息

2023-11-07 10:01:34

2021-05-07 22:17:06

手機定位信號

2013-04-11 12:40:16

Android消息機制

2011-12-02 10:58:06

數據結構Java

2013-03-28 09:07:37

Android開發Intent機制

2017-05-15 19:40:40

AndroidIPC機制

2014-03-04 15:28:32

iOS開發消息傳遞機制

2021-12-06 23:00:36

CC++編程語言

2011-05-31 11:55:00

Android 消息機制

2019-10-22 08:12:49

消息隊列分布式系統

2022-06-13 11:05:35

RocketMQ消費者線程

2011-06-03 08:58:14

2021-11-24 08:33:09

Android廣播機制應用程序

2010-04-21 14:49:13

Unix消息隊列
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 免费黄色的视频 | 国产欧美精品一区二区三区 | 色综合久久伊人 | 国内精品久久久久久影视8 最新黄色在线观看 | 高清欧美性猛交xxxx黑人猛交 | 天天操天天摸天天干 | 婷婷久久综合 | 中文一区二区 | 久久最新精品 | 国产欧美日韩一区二区三区在线观看 | 亚洲成人精品在线观看 | 午夜网 | 97精品超碰一区二区三区 | 国产日韩一区二区三区 | 在线精品观看 | 欧美激情视频一区二区三区在线播放 | 久久性av | 中文字幕视频在线看 | 色天天综合| 成人中文字幕av | 在线国产一区二区 | 欧美激情精品久久久久久变态 | 欧美精品在线播放 | 国产福利在线 | 亚洲成网 | 国产成人精品免费视频大全最热 | 黄色一级片视频 | 久久国产一区 | 亚洲一区二区在线 | 久久精品国产久精国产 | 亚洲免费观看 | 精品视频免费 | 天天操天天怕 | 羞羞视频网站免费看 | 国产一区二区三区四区在线观看 | 国产99精品 | 日韩精品视频在线 | 国产精品日产欧美久久久久 | 国产免费拔擦拔擦8x高清 | 久久一区精品 | 日韩美女一区二区三区在线观看 |