Android UiDevice#waitForIdle 真的有效嗎

本篇跟 Android UiAutomator 自動化測試相關(guān)叫确,通過閱讀以下內(nèi)容,您將了解到:UiDevice#waitForIdle 這個方法是如何通過代碼檢測到 UI 界面靜止的

通過查看調(diào)用關(guān)系膀钠,發(fā)現(xiàn) waitForIdle 的最終實現(xiàn)是在 framework 層的 UiAutomation 中

```

// UiAutomation

void waitForIdle(long idleTimeoutMillis, long globalTimeoutMillis)

```

該方法包含 2 個參數(shù)掏湾,都是超時時間,具體看看代碼邏輯推斷它們的作用

```

final long startTimeMillis = SystemClock.uptimeMillis();

if (mLastEventTimeMillis <= 0) {

? ? mLastEventTimeMillis = startTimeMillis;

}

while (true) {

? ? final long currentTimeMillis = SystemClock.uptimeMillis();

? ? final long elapsedGlobalTimeMillis = currentTimeMillis - startTimeMillis;

? ? final long remainingGlobalTimeMillis =

? ? ? ? ? ? globalTimeoutMillis - elapsedGlobalTimeMillis;

? ? if (remainingGlobalTimeMillis <= 0) {

? ? ? ? throw new TimeoutException("No idle state with idle timeout: "

? ? ? ? ? ? ? ? + idleTimeoutMillis + " within global timeout: "

? ? ? ? ? ? ? ? + globalTimeoutMillis);

? ? }


? ? final long elapsedIdleTimeMillis = currentTimeMillis - mLastEventTimeMillis;

? ? final long remainingIdleTimeMillis = idleTimeoutMillis - elapsedIdleTimeMillis;

? ? if (remainingIdleTimeMillis <= 0) {

? ? ? ? return;

? ? }

? ? try {

? ? ? ? mLock.wait(remainingIdleTimeMillis);

? ? } catch (InterruptedException ie) {

? ? ? ? /* ignore */

? ? }

}

```

這段代碼中關(guān)于時間的變量較多肿嘲,一個個看

mLastEventTimeMillis 是一個成員變量融击,它在 onAccessibilityEvent 回調(diào)中得到賦值

```

// UiAutomation$ IAccessibilityServiceClientImpl# onAccessibilityEvent

mLastEventTimeMillis = event.getEventTime();

```

記錄的是當(dāng)前收到的 AccessibilityEvent 事件時間,如果事件時間無效(mLastEventTimeMillis <= 0)雳窟,在 waitForIdle 方法中就會記錄為當(dāng)前代碼被執(zhí)行時的系統(tǒng)時間

回到 waitForIdle 方法體中尊浪,當(dāng) remainingGlobalTimeMillis <= 0 時會拋出一個異常,說的是沒有 idle 狀態(tài)封救,說明 remainingGlobalTimeMillis 是用來表示監(jiān)測 idle 超時的變量拇涤,因此 globalTimeoutMillis 是設(shè)定的監(jiān)測超時時長

當(dāng) remainingIdleTimeMillis <= 0 時,方法直接 return 了誉结,說明監(jiān)測到了 idle 狀態(tài)鹅士,因此只要該變量不大于 0,說明當(dāng)前就是界面空閑的

lapsedIdleTimeMillis 表示距離上一次收到 AccessibilityEvent 事件過去了多長時間惩坑,假如密集地收到該事件掉盅,則 currentTimeMillis - mLastEventTimeMillis 就可能始終是個負(fù)值,那么 remainingIdleTimeMillis > 0 就始終不是 idle 狀態(tài)旭贬,后續(xù)就會觸發(fā)到監(jiān)測 idle 超時

而如果某個時候不再收到該事件了怔接,那么 currentTimeMillis - mLastEventTimeMillis 足夠大,并且超過 idleTimeoutMillis (注:這個值在 UiAutomator 中寫定為 500ms)時稀轨,remainingIdleTimeMillis <= 0 就會發(fā)生

因此,wait for Idle 是否真的能夠準(zhǔn)確監(jiān)測到 idle 的關(guān)鍵是 AccessibilityEvent 事件是如何產(chǎn)生的岸军。這里主要看看該事件有哪些類型

* TYPE_VIEW_CLICKED

* TYPE_VIEW_LONG_CLICKED

* TYPE_VIEW_SELECTED

* TYPE_VIEW_FOCUSED

* TYPE_VIEW_TEXT_CHANGED

* TYPE_WINDOW_STATE_CHANGED

* TYPE_NOTIFICATION_STATE_CHANGED

* TYPE_VIEW_HOVER_ENTER

* TYPE_VIEW_HOVER_EXIT

* TYPE_TOUCH_EXPLORATION_GESTURE_START

* TYPE_TOUCH_EXPLORATION_GESTURE_END

* TYPE_WINDOW_CONTENT_CHANGED

* TYPE_VIEW_SCROLLED

* TYPE_VIEW_TEXT_SELECTION_CHANGED

* TYPE_ANNOUNCEMENT

* TYPE_VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY

* TYPE_GESTURE_DETECTION_START

* TYPE_GESTURE_DETECTION_END

* TYPE_TOUCH_INTERACTION_START

* TYPE_TOUCH_INTERACTION_END

* TYPE_WINDOWS_CHANGED

* TYPE_VIEW_CONTEXT_CLICKED

比如奋刽,當(dāng) view 被點(diǎn)擊,被選取艰赞,或者文字內(nèi)容發(fā)生變化等的情況下佣谐,就會發(fā)送 AccessibilityEvent 事件,也即此時不是 idle 狀態(tài)方妖。所以這個方法里體現(xiàn)的 idle狭魂,說的也正是界面的靜止?fàn)顟B(tài)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末榆浓,一起剝皮案震驚了整個濱河市伙判,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖握侧,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異撞蜂,居然都是意外死亡焦读,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進(jìn)店門睬涧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來募胃,“玉大人,你說我怎么就攤上這事畦浓”允” “怎么了?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵讶请,是天一觀的道長参袱。 經(jīng)常有香客問我,道長秽梅,這世上最難降的妖魔是什么抹蚀? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮企垦,結(jié)果婚禮上环壤,老公的妹妹穿的比我還像新娘。我一直安慰自己钞诡,他們只是感情好郑现,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著荧降,像睡著了一般接箫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上朵诫,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天辛友,我揣著相機(jī)與錄音,去河邊找鬼剪返。 笑死废累,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的脱盲。 我是一名探鬼主播邑滨,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼钱反!你這毒婦竟也來了掖看?” 一聲冷哼從身側(cè)響起匣距,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎哎壳,沒想到半個月后毅待,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡耳峦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年恩静,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蹲坷。...
    茶點(diǎn)故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡驶乾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出循签,到底是詐尸還是另有隱情级乐,我是刑警寧澤,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布县匠,位于F島的核電站风科,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏乞旦。R本人自食惡果不足惜贼穆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望兰粉。 院中可真熱鬧故痊,春花似錦、人聲如沸玖姑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽焰络。三九已至戴甩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間闪彼,已是汗流浹背甜孤。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留备蚓,地道東北人课蔬。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像郊尝,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子战惊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評論 2 359

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