AccessibilityService 獲取界面節點,但是界面節點部分沒有載入完成
列印 android.widget.ListView 節點 顯示 正在載入
我想延時一下應該可以,于是
try { Thread.sleep(8800); } catch (InterruptedException e) { }
AccessibilityNodeInfo rootNode_ts = service.getRootInActiveWindow();
rootNode_ts .refresh(); //再重繪一下 再獲取
但是依然不能獲取節點資訊,例如android.widget.ListView里的 內容,有時能獲取,有時獲取為空
十分煩惱!!!!!
我想請教各位朋友,如何正確延時等待 android.widget.ListView里的內容完全載入呢?
非常感謝了各位
uj5u.com熱心網友回復:
玩過Accessibility貌似沒有你說的這個問題,既然你已經得到了ListView的資訊,理論上子節點的資訊也能得到的。發一下偽代碼吧,沒明白你的“正在載入”是個什么提示?uj5u.com熱心網友回復:
那么如何延時一下呢?try { Thread.sleep(8800); } catch (InterruptedException e) { }
這樣會阻塞,手機停止回應
uj5u.com熱心網友回復:
就是比如wx某個頁面一進去需要先獲取資料,然后wx會根據獲取的資料決定是否顯示某些節點,這樣這個節點就延遲才會顯示。怎么樣才能判斷什么時候這個頁面資料獲取完成并且節點已經顯示了?不然一進來就獲取這個節點是獲取不到的
uj5u.com熱心網友回復:
由于權限有限,你說的這種只能輪詢查找:
當微信界面打開時>查找當前節點是否加載完成>加載未完成發送handler延時1秒(不是sleep)>查找當前節點是否加載完成.....直到加載完成
uj5u.com熱心網友回復:
你說的這種我大部分都是這么做的,雖然我用了sleep,但是我不能無限回圈去找這個節點,因為:獲取到資料后這個節點的顯示方式有兩種,一種顯示一種不顯示。顯示的時候又分為兩個狀態,我除了需要判斷這個節點的兩個狀態外(根據desc判斷),這個節點根據回傳的資料也有可能的確是不顯示,這種不顯示是正確的,如果不顯示的時候就繼續去輪循就無法知道這個節點的確是不顯示了。界面內沒有每次資料加載完成就一定會顯示的其他節點,所以不知道該怎么判斷了。
uj5u.com熱心網友回復:
你說的確實是沒辦法的,你可以試試加一個超時操作或者根據某個節點來判斷是否加載完成(比如聊天界面,當串列里有用戶頭像,并且已經過了20秒了仍然沒有你要的資訊,完全可以認為節點不存在)uj5u.com熱心網友回復:
嗯,謝謝你的解答,好像確實沒辦法了,我現在用的方法是在子執行緒里:
for (int i = 0; i < 5; i++) {
sleep(200);
List<AccessibilityNodeInfo> sNodes = rootNode.findAccessibilityNodeInfosByViewId(id);
if (sNodes != null && !sNodes.isEmpty()) {
AccessibilityNodeInfo sNode = sNodes.get(0);
if (sNode != null) {
找到了
break;
}
}
}
回圈完還是找不到就不找了,在做自動化處理,不能等太久,設了1秒鐘。
uj5u.com熱心網友回復:
樓主 我也是和你一樣的情況 進入支付寶賬單的時候,只拿了一個賬單詳情,然后顯示text:加載中!!!不知道怎么解決,樓主解決了請回復一下我,感激不盡uj5u.com熱心網友回復:
樓主 我也是和你一樣的情況 進入支付寶賬單的時候,只拿了一個賬單詳情,然后顯示text:加載中!!!不知道怎么解決,樓主解決了請回復一下我,感激不盡
高手都不理我們
uj5u.com熱心網友回復:
樓主 我也是和你一樣的情況 進入支付寶賬單的時候,只拿了一個賬單詳情,然后顯示text:加載中!!!不知道怎么解決,樓主解決了請回復一下我,感激不盡
高手都不理我們
那理你們的呢?
uj5u.com熱心網友回復:
高手都不理我們
樓主 我也是和你一樣的情況 進入支付寶賬單的時候,只拿了一個賬單詳情,然后顯示text:加載中!!!不知道怎么解決,樓主解決了請回復一下我,感激不盡
請重新發帖,描述清楚需求
我剛剛試了,當資料完全展示的時候是可以獲取到支付寶賬單串列的,賬單詳情需要getChild遍歷得到,你說的加載中到底是什么意思,可以延時5秒再獲取看看是否成功
uj5u.com熱心網友回復:
開辟一個子執行緒,設定一個最大請求時間,當你確定進入了指定的頁面后(點擊了某個按鈕),就啟動子執行緒,子執行緒里面,回圈判斷,是否找到相應節點,最好用dfs找className ,找到了就給主執行緒發訊息uj5u.com熱心網友回復:
超過了最大請求時間都沒找到,就給主執行緒發沒找到的訊息uj5u.com熱心網友回復:
在onServiceConnected里這是一下,或者xml里配置notificationTimeout,表示這個時間之后,監聽事件才會執行回呼,其實也是延時執行了,但要合理使用,動態調整時間。不然每次事件的回應都是設定的時長就不好了,需要的地方設定,邏輯結束后,設定為0即可AccessibilityServiceInfo info = getServiceInfo();
info.notificationTimeout = 1000;
setServiceInfo(info);
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/10802.html
標籤:Android
上一篇:Qt 多執行緒復制檔案崩潰
