2017-07-25 23 views
0

你可以得到一些查看屬性,如heightalphaidmatrix,使用標準的干將drawingTimeelevation(如getHeight()getAlpha()getId() ...)。爲什麼Android View類爲少數屬性提供'outValues style'getter?

但是,你有一些查看的屬性(其中大部分與PointRect返回類型)像locationInWindowglobalVisibleRectlocationInScreendrawingRectdrawingCache下干將隱藏的是強迫你創建一個空的構造事先返回對象,並將這些對象作爲getter參數傳遞,以便將數據「保存」給它們。爲globalVisibleRect吸氣的

例子:

public final boolean getGlobalVisibleRect(Rect r) 

強迫你做這樣的事情(科特林):

val rect = Rect() 
getGlobalVisibleRect(rect) 
doSomeStuffWithRect(rect) 

這不是真的一致,也不是調試的實時使用表達式標籤在Android Studio中,它真的很麻煩。

爲什麼這樣做?如果View不可見,我會看到一些返回false布爾值的方法,因此您知道返回的數據是無效的,但是如果方法已經知道它產生了不可用的信息,那麼不應該使用返回空值來解決它。另一方面,getLocationOnScreen返回void並且沒有附加參數,所以我不能真正理解爲什麼你會以這種方式複雜化。

回答

1

爲什麼這樣做?

鼓勵對象的重用,例如通過對象池。創建數十億個實例並使用GC進行清理效率低下,特別是在2006年代的設備上。創建和收集zillion Rect實例也會碎片堆,這對於Android 8.0之前的設備仍然是一個問題,儘管Android 5.0的更改有所幫助。

+0

這是一個非常有趣的觀點,儘管我從來沒有見過開發人員使用對象池來合併視圖的屬性。請稍微閱讀一下堆碎片,謝謝! –

+1

@PrzemyslawJablonski:請記住,應用程序開發人員不是像getGlobalVisibleRect()這樣的方法的主要消費者。該框架以'View','ViewGroup'和kin的形式出現。 – CommonsWare

相關問題