• 老李推荐:第14章8节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-获取控件列表并建立控件树 6


    这里如果你对java熟悉的话其实很简单,就是根据控件属性的名字对properties列表进行一次排序而已。如果你对java不熟悉的话,那就要先去查下Collections.sort这个方法是怎么回事了。顾名思义它提供的是对一个集合List的排序功能,但是根据什么来排序呢?这里就涉及到两个概念了:

    • Comparator接口:提供的是一个接口,用户应该去实现该接口来提供列表中两个元素的对比功能
    • 另外一个是匿名类:上面的new Comparator的写法就是建立一个实现了Comparator接口的匿名类

    对于匿名类,如果上面的代码做转换成以下应该会让你清晰多了。比如我们先定义一个实现了Comparator的类:

     public class PropertyComparator implements Comparator{  

          public int compare(ViewNode.Property source, ViewNode.Property destination) {  

           return source.name.compareTo(destination.name);  

          }  


    然后把上面的排序部分调用改成:

    Comparator propComp = new PropertyComparator();  

    Collections.sort(this.properties, propComp);  


    这样应该就好理解多了,如果还不清楚的话那我建议你还是先去学习下java的基本知识再返回来往下看。

    在获取了控件属性和对属性排好序之后,我们继续往下分析loadProperties方法的第三部分:

     168   private void loadProperties(String data) {  

        ...  

    206     this.height = (this.namedProperties.containsKey("getHeight()") ? getInt("getHeight()", 0) : getInt("layout:getHeight()", 0));  

    207   

    208   
    209     this.scrollX = (this.namedProperties.containsKey("mScrollX") ? getInt("mScrollX", 0) : getInt("scrolling:mScrollX", 0));  
    210   
    211   
    212     this.scrollY = (this.namedProperties.containsKey("mScrollY") ? getInt("mScrollY", 0) : getInt("scrolling:mScrollY", 0));  

        ...  

    }  

    代码14-8-11 ViewNode-loadProperties-保存获取的属性

    这里虽然代码很长,但是每一行做的事情基本上都一样,都是很简单的去刚才建立好的namedProperties映射里面根据属性名称取得对应的属性值,然后保存到ViewNode对应的变量里面去。但注意并不是所有的属性都会取出来另外存储,只有那些常用的属性会这样子做。

     168   private void loadProperties(String data) {  

        ...  

    254     for (String name : this.namedProperties.keySet()) {  

    255       int index = name.indexOf(':');  

    256       if (index != -1) {  

    257         this.categories.add(name.substring(0, index));  

    258       }  

    259     }  

    260     if (this.categories.size() != 0) {  

    261       this.categories.add("miscellaneous");  

    262     }  


    263   }

    代码14-8-12 ViewNode-loadProperties-组建控件属性类型列表

    上面我们有提过,控件的属性名称是有两部分组成的,冒号之前的是属性的类型,比如上面提到的layout类型。以上代码所做的事情就是找到一个属性的冒号的位置,然后把之前的那部分属性类型字串给取出来保存到properties这个集合里面。


     106   public Set<String> categories = new TreeSet();  


    代码14-8-13 ViewNode-categories-控件属性类型集合

    到了现在整个控件树以及控件的建立过程就算分析完成了,我们这里稍稍总结下整个流程:

        • 测试脚本在调用HierarchyViewer类的findViewById方法的时候首先会去调用ViewNode的 loadWindowData方法
        • 该方法会先去ViewServer发送DUMP命令来获得所有控件信息
        • 获得所有控件信息后会调用parseViewHierarchy方法去创建好整棵ViewNode组成的控件树
  • 相关阅读:
    C# 中 枚举Enum 一些转换的方法整理
    qt creator源码全方面分析(3-8)
    qt creator源码全方面分析(3-7)
    qt creator源码全方面分析(3-6)
    qt creator源码全方面分析(3-5)
    qt creator源码全方面分析(3-4)
    qt creator源码全方面分析(3-3)
    qt creator源码全方面分析(3-2)
    精校版网络小说下载地址
    qt creator源码全方面分析(3)
  • 原文地址:https://www.cnblogs.com/poptest/p/5110613.html
Copyright © 2020-2023  润新知