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里的内容完全载入呢?非常感谢了各位

解决方案 »

  1.   

    玩过Accessibility貌似没有你说的这个问题,既然你已经得到了ListView的信息,理论上子节点的信息也能得到的。发一下伪代码吧,没明白你的“正在载入”是个什么提示?
      

  2.   

    那么如何延时一下呢?try { Thread.sleep(8800); } catch (InterruptedException e) { }这样会阻塞,手机停止响应
      

  3.   


    就是比如wx某个页面一进去需要先获取数据,然后wx会根据获取的数据决定是否显示某些节点,这样这个节点就延迟才会显示。怎么样才能判断什么时候这个页面数据获取完成并且节点已经显示了?不然一进来就获取这个节点是获取不到的
      

  4.   

    由于权限有限,你说的这种只能轮询查找:
    当微信界面打开时>查找当前节点是否加载完成>加载未完成发送handler延时1秒(不是sleep)>查找当前节点是否加载完成.....直到加载完成
      

  5.   

    由于权限有限,你说的这种只能轮询查找:
    当微信界面打开时>查找当前节点是否加载完成>加载未完成发送handler延时1秒(不是sleep)>查找当前节点是否加载完成.....直到加载完成你说的这种我大部分都是这么做的,虽然我用了sleep,但是我不能无限循环去找这个节点,因为:获取到数据后这个节点的显示方式有两种,一种显示一种不显示。显示的时候又分为两个状态,我除了需要判断这个节点的两个状态外(根据desc判断),这个节点根据返回的数据也有可能的确是不显示,这种不显示是正确的,如果不显示的时候就继续去轮循就无法知道这个节点的确是不显示了。界面内没有每次数据加载完成就一定会显示的其他节点,所以不知道该怎么判断了。
      

  6.   

    嗯,谢谢你的解答,好像确实没办法了,我现在用的方法是
    在子线程里:
                   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秒钟。