[英]Android - Layouts performance: Programmatic vs XML
對於大多數實際意圖和目的,對這兩種方法都沒有顯着的性能影響。 如果你需要誇大一個特別大的特定布局可能是相關的,此時你可能會嘗試自己進行基准測試,看看是否有任何真正的差異,但是否則我很難設想出一個結果的場景無論如何都會產生重大影響。
假設你有一個布局:
<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做的還要長。 另外:
可能還有其他原因,但這些只是我的頭腦。 不要誤會我的意思,有很多時候手動操縱視圖和層次結構是有價值的,但我不會用通脹來代替通貨膨脹。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.