簡體   English   中英

Android - 布局性能:程序化與XML

[英]Android - Layouts performance: Programmatic vs XML

作為一名Android開發人員,通過以編程方式或XML方式聲明布局,讓我不知道應用程序性能是否更好。

我已經在SO上閱讀了這個這個問題,但他們都沒有回答我的問題:

什么是更高性能:以編程方式編寫布局或在xml文件中聲明它們?

請注意,我只詢問性能,我不想要基於其他因素的答案。

另外,我正在尋找一個非常技術性的答案。 如果需要,請提供AOSP代碼的鏈接以證明您的答案(您可以假設Android版本是Marshmallow)。 更好的是指出一個實驗/論文/基准是使用兩種不同方式比較大型布局的加載時間。

對於大多數實際意圖和目的,對這兩種方法都沒有顯着的性能影響。 如果你需要誇大一個特別大的特定布局可能是相關的,此時你可能會嘗試自己進行基准測試,看看是否有任何真正的差異,但是否則我很難設想出一個結果的場景無論如何都會產生重大影響。

假設你有一個布局:

<LinearLayout xmlns:android="..."
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    ... >

    <Button
        android:id="@+id/some_button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/my_button_bg"
        android:text="Hello World" />

    <!-- other views ... -->

</LinearLayout>

Android會將此文件編譯為二進制格式並將其打包到APK中。 當您在運行時使用LayoutInflater時,它會將此二進制格式的塊加載到內存中並對其進行解析,並從內容構建視圖層次結構,這與您在代碼中手動執行的操作非常相似。 解析都是在本機代碼中完成的,因此它可能比java中典型的XML解析更加優化。

LayoutInflater在遇到標記時使用反射構造視圖(例如<Button .../> )。 第一次必須查找該特定視圖的構造函數; 之后它將緩存構造函數以便以后更快地訪問。

你通常會調用mut.setText button.setText(...)button.setBackground(...)等mutator,通常這些視圖會在通脹期間調用這些方法。 也就是說,遍歷視圖構造函數的代碼路徑將根據從二進制XML格式解析的屬性執行這些突變。 這是因為LayoutInflater使用接受AttributeSet的雙參數構造函數。 這里的含義是,當您手動構建視圖時,其中一些方法最終可能會被調用兩次。

例如,在上面的示例布局中選擇Button。 按鈕已經有了一個默認的背景(這實際上是如何提供它本身很有趣,但在這里不是很重要),所以即使只用一個Context調用一個參數構造函數仍然會得到一個具有默認背景的Button 換句話說,代碼路徑包括使用默認背景圖像調用setBackground(...) (或某些等效項)。 然后,您必須使用XML文件中指定的自定義可繪制資源setBackground(...)調用setBackground(...) 現在很難說它有什么影響,因為它實際上取決於個人觀點的實施以及你正在做出的突變。


最后一個想法:我在專業環境中構建了一個應用程序,它避免了所有XML的使用(盡可能多,包括布局以外的東西)。 我可以毫不猶豫地告訴你它非常煩人並且大大增加了開發時間。 我非常擅長它,它比用XML做的還要長。 另外:

  • 代碼往往非常冗長
  • 您無法獲得IDE中圍繞XML布局構建的所有工具的好處
  • 即使沒有工具,只需單獨的XML文件就可以清晰地表示視圖層次結構
  • 您可能必須了解UI框架的某些特性(其中一些可能取決於API級別)
  • 並不總是可以將XML屬性映射到java中相應的mutator方法(有時還取決於API級別)
  • 計算尺寸變得更有趣
  • 記住哪些LayoutParams用於哪里是偉大的心理體操

可能還有其他原因,但這些只是我的頭腦。 不要誤會我的意思,有很多時候手動操縱視圖和層次結構是有價值的,但我不會用通脹來代替通貨膨脹。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM