在我的應用程序中查看性能問題時,我發現每次按下按鈕都會觸發完整的onMeasure()/ layout()循環。我沒有理由再嘗試從頭開始整個應用程序;沒有增加或刪除任何東西,也沒有改變我能看到的尺寸。TextField更改觸發完整佈局週期
當佈局非常擁擠時,問題往往會發生,並且底部的一排按鈕可能超出屏幕邊緣一兩個像素。
有沒有人有這方面的經驗?有什麼方法可以確定爲什麼佈局週期被觸發?
如果屏幕上沒有任何TextField被修改(見Finding the cause of a layout request in a ViewGroup),似乎佈局不會被觸發。修改TextField是否會觸發重新佈局?我可以鎖定它以防止這種情況發生?令人沮喪的是,認爲在屏幕上的任何位置更改任何TextField都會導致整個度量/佈局週期在整個應用程序中級聯;它正在屠殺我的表現。
該容器是一個自定義ViewGroup類,但我不認爲這是問題所在。我沒有看到我可以採取什麼不同的做法來阻止它被調用。
我正在考慮爲我的小部件添加一個「鎖定」方法,以防止初始佈局後發生任何進一步的佈局更改。這會提高性能,但我寧願解決潛在的問題。
這裏是當時的堆棧我onMeasure()方法被調用:
Gridbox.onMeasure(INT,INT)線:217
Gridbox(查看).measure(INT,INT)線:8171
的FrameLayout(ViewGroup中).measureChildWithMargins(查看,INT,INT,INT,INT)線:3132 FrameLayout.onMeasure(INT,INT)線:245
的FrameLayout(查看).measure(INT,INT)線:8171
PhoneWindow $ DecorView(ViewGroup).measureChildWithMargins(View,int,int,int,int)line:3132
PhoneWind流$ DecorView(FrameLayout裏).onMeasure(INT,INT)線:245
PhoneWindow $ DecorView(查看).measure(INT,INT)線:8171
ViewRoot.performTraversals()線:801
ViewRoot.handleMessage(消息)線:1727
的ViewRoot(處理程序).dispatchMessage(消息)線:99 Looper.loop()線:123 ActivityThread.main(字符串[])線:4627
Method.invokeNative(對象,對象[ ZygoteInit $ MethodAndArgsCaller.run():line:不可用[本機方法]
Method.invoke(Object,Object ...)line:521
ZygoteInit $ MethodAndArgsCaller.run()line: 858
ZygoteInit.main(字符串[])線:616 NativeStart.main(字符串[])行:不可用[本機方法]
是的,不幸的是,在我的情況下,它發生在*每個按鈕按下並生成整個應用程序的重新佈局。我收到了來自用戶的關於性能的投訴,所以我必須處理它。 –
這裏有兩個問題。 1:按下按鈕不應該觸發*整個*應用程序的重新佈局,該框架可以防止出現這種情況。可能有某些特定於您的應用程序導致此行爲。 2:重新佈置應該不會太長,以至於用戶會注意到它。我不知道您有多少視圖或您的自定義ViewGroup的功能,但似乎應該對您的應用進行配置,以瞭解爲什麼需要這麼長時間。 –
該應用程序是RpnCalc。它有5個TextFields,39個按鈕和30多個標籤。我的自定義視圖組基本上是我自己的GridBag實現。我很樂意與任何想看看它的人分享代碼。我是第一個承認它效率不高的人,我只是很樂意在不需要的時候阻止它被調用。我確實介紹了我的應用該配置文件告訴我,大部分時間都被我的佈局小部件以及所有對onMeasure()調用的各種組件所佔用。 –