Android之UI Automator框架源碼分析(第x篇:UiWatcher的註冊與反註冊)

(注意:本文基於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的位置)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章