为什么HierarchyViewer的findViewById非常缓慢?

时间:2012-11-06 19:48:04

标签: android monkeyrunner

找到一些UI控件(例如按钮)需要5-6秒。

两个问题:

1)为什么这么慢?

2)有没有办法让它更快或找到UI控制的替代解决方案(在monkeyrunner测试范围内)

3 个答案:

答案 0 :(得分:3)

我稍微研究了一下Android源代码,发现当你在monkeyrunner中使用findViewById搜索一个控件时,它实际上会迭代Android中所有运行窗口的所有控件。

因此,如果您有一些暂停(并且不可见)的活动,未被销毁,findViewById将花时间搜索它。

我现在有几个想法

a)在HierarhyViewer上使用getFocusedWindowName API检查是否显示了正确的窗口。 尝试首先搜索此窗口,然后在findViewById(id,parent)方法中将其指定为父窗口。这样,我们就不会搜索Android上的所有窗口。

2)尝试绕过com.android.chimpchat.hierarchyviewer.HierarchyViewer提供的接口,直接进入DeviceBridge类(为同一协议提供稍低级别)。在这种情况下,我们可以精确地指出应该搜索哪个窗口,而不是获取所有窗口的所有控件。

罗曼指出。 HierarchyViewer将来可能会发生变化。但是,作为测试自动化的一部分,我没有看到任何其他替代品。

答案 1 :(得分:1)

通常只需一次找到控件并将其存储在一个字段中就足够了。

在适配器视图的情况下,它们通常将对其子视图的所有引用存储在对象中,然后使用setTag()将该对象附加到视图。稍后可以使用getTag()检索相同的视图。您可以在网上搜索ViewHolder示例以查看此技术

我怀疑虽然需要5-6秒,但你可能有很多控件..

答案 2 :(得分:0)

AndroidViewClient虽然速度不快,因为它依赖于与HierarchyViewer相同的协议,但它可以提供更简单的替代方法来编写测试。

看看examples。还有一些情况,AndroidViewClient为已知的monkeyrunner错误提供了解决方法(请参阅此example