(注意:本文基於UI Automator測試框架版本爲2.2.0)
關於操作UiWatcher的方法共計6個,全部定義在UiDevice類中,註冊與反註冊UiWatcher是一切的前提,不然後續的關於UiWatcher的方法就沒有什麼作用了,UiWatcher非常重要,它能保證我們測試項目的穩定(主要用於彈窗處理,網絡處理等等),本篇文章我們就學習一下UiWatcher的註冊與反註冊功能是如何實現的??
registerWatcher方法(位於UiDevice類中)
接受一個String對象(表示Watcher的名字),接受一個UiWatcher對象(表示UI監聽對象)
public void registerWatcher(String name, UiWatcher watcher) {
Tracer.trace(name, watcher);
if (mInWatcherContext) {
throw new IllegalStateException("Cannot register new watcher from within another");
}
mWatchers.put(name, watcher);
}
1、先是將傳入的參數name與watcher都傳入到一個Tracer的靜態方法trace中,這個方法記錄線程的堆棧信息的!
2、接着判斷mInWatcherContext,它是UiDevice對象持有的一個boolean標誌位,它表示是否正在處於UiWatcher的處理邏輯中,在當前方法中可以防止UiWatcher的checkForCondition方法中註冊一個新的Uiwatcher對象(不能從另一個觀察者中註冊新的觀察者,否則就會拋出一個IllegalStateException),該標誌位另外一個作用是防止UiWatcher的checkForCondition方法正在觸發時,連續被觸發
3、通過上面的檢查,到了真正註冊的位置,是通過mWatchers的put方法將name與watcher完成註冊,mWatchers是UiDevice對象持有的一個容器,一個HashMap對象,name作爲key,watcher作爲value,這就完成了一個UiWatcher對象的註冊
removeWatcher方法(位於UiDevice類中)
接受一個String對象(表示UiWatcher的名字)
public void removeWatcher(String name) {
Tracer.trace(name);
if (mInWatcherContext) {
throw new IllegalStateException("Cannot remove a watcher from within another");
}
mWatchers.remove(name);
}
既然註冊UiWatcher是保存到一個HashMap對象中,那麼反註冊當然就是從HashMap對象中移除一個UiWatcher!
在該方法中首先也是進行線程堆棧的處理,然後對標誌位mInWatcherContext進行判斷容錯,同樣不能在UiWatcher中移除一個UiWatcher!
最後則是HashMap的移除元素,只要傳入一個表示UiWatcher名字的key對象name
總結
1、UiWatcher對象存儲在UiDevice持有的HashMap對象中,這就完成了註冊工作
2、反註冊的方法,則從HashMap中移除元素即可
3、看來UiWatcher的註冊時候的name,我們要統一管理好,隨時可以根據需求情況,註冊與取消註冊UiWatcher對象
4、在Uiwatcher的checkForCondition方法中不能進行註冊與反註冊方法的調用的(以下截圖是mInWatcherContext唯一賦值爲true的位置)