XML布局中的性能与代码中的布局?

在android中的代码与XML布局完成的布局之间有任何性能差异?

据我所知,我可以做一个区别。 请尽可能纠正/加强我的回答。

  1. 对于基于XML的 ,在编译时,生成的ID存储在R文件中,我们用它来引用代码中的任何特定布局(如TextView,Button等)。 由于引用ID是在编译时生成的,所以在运行时这个开销不存在,而且速度更快。
  2. 基于代码的情况下 ,运行时所做的所有事情都会让应用变慢。 如果有少量的布局,那么它就不那么明显了。 但是,如果您正在用语法创建大量布局,那么您可能会意识到应用程序的缓慢。

是。 XML布局需要加载,解析和膨胀来生成视图。 在幕后, LayoutInflater完成了通过代码编写布局时所要做的事情,但前面提到了开销。 下面是关于这个主题的一篇有趣的文章,它涵盖了通过代码生成视图,也是关于一个用Kotlin编写的库: https : //nethergrim.github.io/performance/2016/04/16/anko.html

即使有一个性能的胜利,我不会建议编写代码布局,原因如下。

  • 您将您的布局和业务逻辑耦合在一起。 这总是很糟糕。
  • 你不能使用AppCompatDelegate的功能(加载视图为最新的Androind版本,例如一个AppCompatButton而不是一个普通的Button

很难想象使用XML会更快。

Android SDK有很多性能调整,使得加载和解析XML的速度更快。 在最近一段时间里,如果使用数据绑定来替换findViewById,则会显着提高性能,并且每次调用findViewById都会解析XML树。 数据库只会解析一次树。

另外,在XML中使用include可以重用视图,这可以提高性能,特别是在有大的对象流失的情况下。 有各种各样的永恒缓存和对象池,所以有可能将被膨胀的对象缓存/集中并克隆以供后续使用,从而减少使用XML的开销。 我知道这对于可绘制资产来说绝对是这种情况,因此需要调用mutate,如果您打算修改它。

有些情况下代码会比较慢,每创建一个视图并添加到您的布局中,您都会触发一个度量和布局传递,因此如果您尝试在运行时使用代码构建复杂的深层嵌套布局,则需要加载时间更长。

还有其他一些因素需要考虑,比如:

  • 如果不是在运行时不可能应用,那么造型很难。
  • 代码与视图创建完整的运行时间复杂,难以维护和容易出错。
  • 您可以使用ConstraintsLayout来平整您的视图,从而避免编写自定义ViewGroups,如果性能是一个问题。
  • XML允许使用编辑器来预览和调试您的布局。

如果要创建的ViewGroup很简单,或者只是想创建一个View并将其插入到ViewGroup中,那么在代码中执行操作可能很难按任何标准进行。

如果你想做更复杂的事情,使用XML和所有的功能,如ViewStub,包括DataBinding可能是要走的路。 我已经注意到,如果你做了很多事情,那么膨胀视图就显得很慢,所以ViewHolder模式,但如果你小心,很难证明在代码中构建视图和ViewGroups,除了简单的布局添加。