安卓XML与Java布局性能对比

26
Android SDK提供给开发者在xml文件或直接在java代码中编写布局的方法。我了解到,大多数人都认为使用xml编写布局更易于维护和编写,但它们是静态的。而Java布局是动态的,但没有人评论其性能问题。我唯一发现的关于性能的问题是,嵌套布局会对性能产生负面影响。与其编写嵌套布局,最好是自定义一个布局。到目前为止,一切都很好😉。
那么,布局设计方面呢?使用xml还是java代码?Android如何解析xml文件,是在运行时还是编译时?即使它们在编译时被解析,也应在运行时使用。那么,在xml中声明RelativeLayout还是在onCreate方法中声明哪个更快?

实例化视图比从XML文件中填充视图要快一点。除非你的Java代码太糟糕了。 - nhoxbypass
使用XML相比于运行时创建布局的最大优势是“你可以预览而无需每次都运行它”,我认为这本身就是一个很强的理由。 - eRaisedToX
4个回答

23

布局定义用户界面的可视化结构,例如活动或应用程序小部件的UI。您可以通过两种方式声明布局:

  • 在XML中声明UI元素。Android提供了一个简单的XML词汇表,对应于View类和子类(例如小部件和布局)。

  • 在运行时实例化布局元素。您的应用程序可以以编程方式创建View和ViewGroup对象(并操纵其属性)。

Android框架为您提供了使用这两种方法声明和管理应用程序UI的灵活性。例如,您可以在XML中声明应用程序的默认布局,包括将出现在其中的屏幕元素及其属性。然后,您可以在应用程序中添加代码,以修改屏幕对象的状态,包括在XML中声明的那些对象,在运行时。

Eclipse的ADT插件提供了XML的布局预览 - 打开XML文件,选择Layout选项卡。

您还应尝试Hierarchy Viewer工具来调试布局 - 它会显示布局属性值、带填充/边距指示器的线框和完整渲染视图,同时您可以在模拟器或设备上进行调试。

layoutopt工具让您快速分析不效率或其他问题的布局和层次结构。

在XML中声明UI的优点是,它使您能够更好地分离应用程序的演示与控制其行为的代码。您的UI描述是外部的,这意味着您可以修改或适应它,而无需修改源代码并重新编译。例如,您可以为不同的屏幕方向、不同的设备屏幕大小和不同的语言创建XML布局。此外,在XML中声明布局使得更容易可视化UI的结构,因此更容易调试问题。

当你编译你的应用程序时,每个XML布局文件都会被编译成一个View资源。你应该从应用程序代码中加载布局资源,在你的Activity.onCreate()回调函数实现中这样做。通过将对布局资源的引用作为参数传递给setContentView()方法来实现:

如果觉得内容过多,可以访问此链接http://developer.android.com/guide/topics/ui/declaring-layout.html获取更多信息。


1
我可以用自己的话来回答,但我认为您可以从Android开发者文档中获得更好的理解。这就是为什么.. :-) - user370305
1
谢谢您的回答,我已经阅读了Android文档,但是关于性能呢?视图资源加载速度比代码生成的快吗? - Kamen Stoykov
2
@KamenStoykov,只要您正确声明 XML 布局,就没有任何明显的区别。 - Vinay S Shenoy
2
性能最差的情况就是两者一样。实际上,XML布局是JAVA类的表示形式。 - user370305
2
实际上,当您在代码中声明rl = new RelativeLayout()时,它也会编译和执行。但是您是以Java格式编写的。同样,当您在XML中编写<RelativeLayout .. />时,它也会编译为Java类代码并执行。而在XML中,您有一些代表性格式。 - user370305
显示剩余2条评论

4

决定在哪里声明UI组件的一个主要因素是它在应用程序生命周期中的行为。如果它是静态的,我会在XML中声明所有需要的属性,如果它根据用户交互而改变,我就必须在活动中实现它。

我尽可能使用XML,因为它具有上述好处,如一致性、更好的各种屏幕大小管理、本地化、资源管理等。


1
这在性能方面没有太大区别,因为您的资源XML文件也将使用aapt工具进行预编译。因此,XML转换将发生在源资源文件中,与Java源文件一起编译为Java类文件。因此,逻辑上来说,性能应该只有大致相同,因为最终两者都会被编译,并且在运行时为两者分配内存。我还通过我的示例应用程序检查了使用XML和使用Java创建类似视图的情况,并在对它们进行剖析时发现视图的渲染时间大致相同。 :-)

0

一个真实案例

这只是我通过使用Telegram安卓应用并阅读其源代码的经验得出的判断。

Telegram的源代码直接使用Java编写。

在我安装了Telegram应用的同一个模拟器中,我创建了一个简单的安卓应用,使用XML和GridLayout创建了9个卡片视图,并在点击事件中显示了一个底部弹出窗口。

我试图比较我的应用的底部弹出窗口与Telegram的底部弹出窗口的流畅度和快速度。第一次点击后,很明显Telegram的响应非常快速和流畅。经过3或4次之后,我的应用的底部弹出窗口也变得流畅。

在我看来,Telegram用户界面的流畅度(以及任何直接使用[java]代码编写的用户界面)是因为:

  1. 它使用了委托技术(我不确定它与用户界面的流畅度有何关联)
  2. 它以适当的方式使用了runOnUiThread
  3. 它使用了基本的视图,如LinearLayout、FrameLayout、TextView、RecyclerView、ListView、ImageView,而没有使用CardViews、Buttons等
  4. 没有使用布局膨胀。

我认为在这个列表中,2和4非常重要。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接