我已阅读https://developer.android.com/reference/android/view/accessibility/AccessibilityNodeInfo.html中的android文档

我不理解文档中有关recycle()和refresh()方法的描述。

1. recycle()-返回实例以供重用。

  • 实例又回到哪里了?
  • 在哪种情况下将重用此实例?
  • AccessibilityNodeInfo可能包含子节点,当我的代码导航到每个节点时我是否需要调用recycle()或仅在根节点处调用recycle方法?

  • 2. refresh()-使用表示的 View 的最新状态刷新此信息
  • 我以为在调用onAccessibilityEvent()方法时,AccessibilityEvent对象应该包含最新状态?
  • AccessibilityNodeInfo可能包含子节点,当我的代码导航到每个节点时我是否需要调用refresh()或仅在根节点处调用refresh方法?
  • 最佳答案

    Android Accessibility API使用AccessibilityNodeInfo节点池。这样,在大树上进行迭代将不会创建许多会减慢垃圾收集器速度的对象。换句话说,当您对一个节点进行cycle()时,您稍后可能会(例如,在下一个事件上或在同一棵树上进行迭代时)再次接收完全相同的节点对象,但会充满完全不同的详细信息。因此,不要持有对已回收节点的引用(例如,尝试将其与其他节点进行比较),这一点很重要。

    获取子节点时,必须回收每个子节点。如果您没有得到它们,则不需要回收它们。您可以在回收 parent 之前回收 child ,反之亦然,这取决于需要访问这些对象的时间。

    当您收到一个节点时,它包含最新状态。但是,当您对其执行操作(例如单击或滚动)时,该节点或其他节点的状态可能会更改。如果要实时查看这些更改(并且不仅是在收到下一个事件时),则必须刷新()节点(或者可以刷新()根节点并尝试获取该节点的新副本)从根开始)

    当您刚获得子节点时,不需要刷新它们(它们已经是新鲜的)。您只需要刷新先前获得的节点(在与它们或与其他节点进行一些交互之前)。

    关于Android AccessibilityNodeInfo refresh()和recycle(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44921893/

    10-09 04:16