在Activity.java的源代码中,我看到了一些方法:
public View findViewById(int id) {
return getWindow().findViewById(id);
}
和getWindow方法的定义:
public Window getWindow() {
return mWindow;
}
但是遵循以下规则:
避免内部吸气人/设定者
在像C ++这样的本地语言中 使用吸气剂的常见做法(例如i = getCount())而不是直接访问该字段(i = mCount)。这是 C ++的一个很好的习惯,因为 编译器通常可以内联 访问,如果你需要限制或 调试字段访问你可以添加 代码随时。
在Android上,这是一个坏主意。 虚方法调用很昂贵, 实例领域要多得多 查找。遵循是合理的 常见的面向对象编程 练习并有吸气剂和制定者 在公共界面,但在一个 你应该总是访问字段 直接
没有JIT,直接进行现场访问 大约比调用一个快3倍 琐碎的吸气剂。随着JIT(在哪里 直接现场访问便宜 访问本地),直接领域 访问速度比快7倍 调用一个微不足道的吸气剂。这是 在Froyo中是真的,但会在改进 JIT内联获取者的未来 方法
所以我想知道为什么Android开发人员不能直接访问这个mWindow对象?如果当前Android版本的JIT无法内联访问,则getWindow()。findViewById(id)将比mWindow.findViewById(id)花费更多时间,而findViewById是一种经常使用的方法。
答案 0 :(得分:2)
首先:你无法访问它,因为它是私有的。
为什么要私有?
正如您所说,直接访问成员的速度更快。另一方面,您正在调用一个不太快的方法,因为它将在视图层次结构中查找某些视图。因此,使用方法而不是直接访问将导致执行该任务所花费的总时间百分比的开销很小。
无论如何,我认为其原因在于封装。
您正在调用您不拥有的内容(即Android SDK)。所以,你不应该对“另一方面”发生的事情做出任何假设。只需使用此方法并期望它将返回您想要的视图(如果不存在,则返回null)。
也许下一个版本的android会使用不同的方法来查看视图,而不是调用getWindow()
。如果您使用此方法,他们(Google / Android)可以简单地将该方法标记为已弃用,并将您的调用“转发”到最新的实现。如果您直接致电getWindow()
,也许您会寻找不再存在的东西。
答案 1 :(得分:1)
您无法直接访问mWindow属性 - it's private。
我不关心findViewById
的速度,因为您只需要在onCreate()
方法中为布局中的每个视图调用一次,并将视图存储在活动成员中。你做每个视图只调用一次findViewById,不是吗? ; - )
但是,如果您真的关心这些事情,可以自己调用getWindow()
,将其存储到局部变量中并直接调用findViewById
。我不建议这样做,因为这里所有的性能提升都不值得花时间,无论如何将会淘汰未来的JIT版本。
如果你这样做,我会对你保存的微秒数非常感兴趣。 : - )
答案 2 :(得分:0)
我们现在有理由微笑......
避免内部getter和setter的android文档将很快改变,据说progruard被添加到Gingerbread平台,它可以很好地内联访问者,请参考"Avoid Internal Getters/Setters" is bad advice和这两个SO帖子。