美文网首页
Android遍历算法

Android遍历算法

作者: shuta | 来源:发表于2017-11-26 11:58 被阅读0次

背景

小组做了一个APP遍历的功能,之前我一直没有看。这两天看源代码整理思路。本来想和其他2个Android遍历产品放在一起做一个对比。但是,后来发现文章太长了,所以独立出来。

遍历需要解决的问题

操作元素

操作元素包括定位元素和操作元素两大块。最主要的是定位元素

  • 定位元素
    定位元素的方法有很多: 包括根据resource-id,name,以及xpath。精确度最高的是resource-id,但不是每一个元素都会有这个属性,所以这个思路废弃。我们小组采用的是xpath定位。在操作元素之前,给每个元素唯一的xpath,具体值怎么计算的,在遍历流程那里细讲。
  • 操作元素成功或者失败
    我们有三个列表来保存操作成功的元素,操作失败的元素,未操作的元素

页面处理

  • 如何定义一个新的页面
    当操作一个元素之后,怎么判断页面是否发生变化?这是遍历算法需要解决的另外一个问题。 我们给每一个页面标识了一个md5值。这个md5值的算法是这样的:
    1. 遍历新页面的每一个node,给每一个node 设置xpath。xpath是这样计算的:
      子节点的 xpath = 父节点的xpath + 子节点name + (与子节点name一样的个数)
      来保证每个节点xpath的唯一性。
    2. 然后将步骤1获得所有节点的xpath值进行拼接,计算md5值作为当前页面的md5值。

回退流程

(还有一个问题,难道页面发生变化之后,node还保留?)
那么,最重要的来了,当操作一个元素之后,接下来的流程是什么呢?

  • 如果进入新的页面
    我们有一个表notTravel,其中存储的是每一个页面的没有遍历过的节点。当进入一个新的页面时,会将这个页面所有有效节点加入notTravel
    • 新页面曾经遍历过,但是没有遍历完成。
      从notTravel 中将新页面所有节点,提到最前面
    • 新页面曾经遍历过,而且所有节点都遍历结束
      会试着移动页面,找到新的遍历页面(?什么操作)。如果移动页失败的话,回退到上一个页面。再执行一遍页面操作的流程。
    • 新页面没有遍历过
      将新页面的所有节点加入notTravel ,并且提前到notTravel表的最前面。
  • 如果停留在老的页面
    1.如果老的页面已经结束
    会试着移动页面,找到新的遍历页面(?什么操作)。如果移动页失败的话,回退到上一个页面。再执行一遍页面操作的流程。

循环回退流程,直到所有的notTravel 中不存在节点了。

  • checksource是干嘛用的?
    1.如果新页面中有元素可以进入到老的页面
    首先回退到老的页面,然后老的页面走一遍页面处理流程;如果停留在新的页面,继续遍历新的页面;如果进入第三方页面,遍历第三方页面。
    2.如果没有
    继续遍历新的页面

遍历流程

基本流程图如下所示啦


image.png

相关文章

  • Android遍历算法

    背景 小组做了一个APP遍历的功能,之前我一直没有看。这两天看源代码整理思路。本来想和其他2个Android遍历产...

  • 数据结构课程 第八周 遍历二叉树

    存储结构为二叉链表 遍历 先序遍历递归算法 中序遍历递归算法 后序遍历递归算法 总结 时间O(n) 空间(O(n)...

  • 二叉树三种遍历的实现(递归)

    前序递归遍历算法:访问根结点-->递归遍历根结点的左子树-->递归遍历根结点的右子树 中序递归遍历算法:递归遍历根...

  • Android程序员经常遇到的算法问题,七大常用的算法

    Android 常用算法1.插入排序算法 插入排序的基本思想是在遍历数组的过程中,假设在序号 i 之前的元素即 [...

  • Java中用递归和迭代实现二叉树的中序( InOrder )遍历

    与数组和链表不同,二叉树有几种遍历方式。遍历算法大致分为深度优先和广度优先遍历算法,这取决于算法实际如何工作。顾名...

  • 常用遍历算法

    for_each(iterator beg, iterator end, _callback); 遍历算法 遍历容...

  • C++遍历算法

    C++遍历算法 待续

  • 非递归求树的深度

    非递归求深度有两种算法:1,现将算法改成先序遍历,在改写成非递归方式。先序遍历遍历是:遍历一个节点前,先算出当前节...

  • 计数排序的稳定性

    这是算法导论里面的算法,排序算法是稳定的。 思考: 为什么9~11的for循环里要倒着遍历?这样倒着遍历,而且放进...

  • 线索二叉树

    结点结构: 算法流程: 算法与中序遍历算法类似,只需要将遍历算法中访问结点的操作具体化为建立正在访问的结点与其非空...

网友评论

      本文标题:Android遍历算法

      本文链接:https://www.haomeiwen.com/subject/qickbxtx.html