2017-07-25 24 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

相关问题