在XML或java文件中编写相同的代码(用于布局)之间是否存在性能差异?

我知道你在XML和java文件中可以做什么和不能做什么有区别,但到目前为止我明白java文件可以做XML文件可以做的所有事情,至少我写的那本书写的是(见下面的引文)。

我的问题是,如果在java或xml中编写代码会有性能差异,如果是:两者中哪一个比另一个更受青睐? 这不是关于正确方法的问题,而是关于纯粹性能的问题。

我知道xml代码被编译成java代码,也许这比翻译java代码更有效率,因为编写xml编译器比编写java文件更容易? (基于xml更容易解析的假设,因为它更具连贯性,结构更简单)


从书中引用

这是本书的实际引用,该文章指出java文件可以执行xml文件可以执行的所有操作。 它通过首先解释有两种方式来创建用户界面,即以声明和编程方式:

声明性方法涉及使用XML来声明UI的外观,…

程序化用户界面涉及编写Java代码以开发UI。

您可以以声明方式执行的所有操作,也可以通过编程方式执行。

在您的活动类中手动创建ui层次结构将比使用xml布局文件更快但更复杂(关于LayoutInflater性能,请参阅在展开布局时使用的createView(String name, String prefix, AttributeSet attrs)方法,您会发现它不是一个速度守护进程),我不能给你任何数字%

我不打扰XML和程序设计的UI之间的性能差异。

基本上,XML方法总是比程序化方法更受青睐。 XML设计的UI更易于阅读和理解,并且由于UI是可视的,我甚至会说可读性是开发可扩展和可维护UI的关键。

对于程序化方法的可读性,最糟糕的情况是UI的每个元素都是在不同的文件中设计的。 想象一下,在一个文件中设计的元素然后在另一个文件中添加到表单中,表单也在另一个文件中设计。 你不会知道什么是交易,对于一个简单的改变,如添加一个按钮或标签,甚至只是更改一些文本,你将不得不经历很多代码。

这意味着您将在进一步开发UI时失去大量时间,并且在某些时候它根本无法维护(您可能能够维护它,但想象一个涉及许多开发团队的大项目,其中不仅仅是一个人需要了解概念和结构,以便能够保持发展的进行)

当然,您无法始终使用XML设计UI。 例如:如果您有自定义模块化控件元素,它们比文本显示更复杂,并且您希望显示它们的动态数量,这取决于数据库查询的结果,那么我保证您将拥有以编程方式将它们添加到您的表单。 因此,您必须在XML中向表单添加固定的最大数量,然后为它们提供数据并在代码中切换它们的可见性。 相信我你不想这样做;)现在回答你的问题:我说XML方法比较慢。 由于您的XML必须保持可显示的最大对象数量,因此您将始终在生命周期中加载和维护对象的开销,甚至不使用它们。 动态生成的对象将降低性能,因为它们的数量不同,因此不是固定的。

编辑:如果您非常关心UI的性能,我建议您对表单的生命周期以及控件元素进行一些研究。 UI是分阶段创建的,在此过程中会触发某些事件。 如果您决定在某个阶段更新显示的信息,它会对性能产生很大影响。 我可能从未为Android开发任何东西,但是使用了actionscript和asp.net我了解到UI性能和显示元素的生命周期齐头并进。

编辑2:对性能的另一个重大影响是您在其inheritance结构树中使用的控件的位置。 看看这个理论inheritance结构:

对象 – > UI元素 – >显示元素 – >图像元素

假设您只有一个要显示的图像。 在这种情况下,您甚至可以在不考虑的情况下使用Image-Element。 但是如果你有很多图像要显示也会改变大小,甚至可能是位置,那么最好不要使用Image-Element并编写一个inheritance的自定义元素,比如UI-Element和满足您的需求。 自定义控件元素更快,因为它更接近inheritance结构树的根。 一般来说,原因是:每次进一步远离根时,您都会获得function,而更多function则以性能为代价。

事实就是这样:在UI线程中完成的所有操作都会降低UI的速度。 因此,如果以编程方式声明布局,它将减慢主线程,如果您不在主线程上创建它,则无法添加视图(如果我错了,有人会纠正我)。 尽可能避免这种情况。

这也是指这个问题最佳实践:Android上的布局(程序化与XML)

与xml设计相比,使用Java代码执行所有视图需要太长时间才能完成,而xml更易于理解,并且如果您使用的是Android Studio或ADT,则在IDE中具有可视化编辑器。 我强烈建议您使用xml来设计应用程序的活动/片段。

编辑1

这个问题解决了UI线程中的视图创建我可以在主线程(UI线程)之外创建UI吗?

编辑2

为了澄清,Android确实在它膨胀时“以编程方式”创建视图。 真正意义上的巨大差异在于,当你对整个布局进行充气时,Android会重新使用某些组件,而以编程方式进行操作并不能确保这一点。

这是相关的stackoverflow问题

编辑3

正如@pskink所指出的,我刚刚查看了LayoutInflater#createView(String name,String prefix,AttributeSet attrs)的代码,它调用了Java的classLoader。 如果它不在内存中,那么这个加载器会创建一个类,因此以编程方式使用createView比使用xml这样做效率低。 因此,使用xml布局的UI比以编程方式膨胀视图的速度慢,因此它不会影响性能

这个答案有一个“但是”,适配器有不同的工作方式,因为它们重新使用视图, 但如果使用正确,自定义适配器将与默认适配器一样有效 。

也许没有有效或适当的方法来衡量xml布局和java代码之间的性能差异。 但为了方便开发,我决定使用xml而不是java代码。 毕竟,你有Palette来立即渲染你的xml布局文件。 当你编写xml时,有小部件的Smart Recommend属性。 你也可以drag and drop小部件。 但是,在编写java文件来布局小部件时,你能做到这一点吗? 当结构过于复杂时,你会写多少行?