【发布时间】:2011-10-20 06:17:26
【问题描述】:
在我的应用程序中,我的 View 的 onMeasure() 覆盖之一有一个无限循环。从我的 onMeasure 中的断点开始调试源代码,我能够一直跟踪自己一直到堆栈跟踪到 PhoneWindow$DecorView 的 measure()(我的视图层次结构中最顶层的类),它由 ViewRoot 调用.performTraversals()。现在从这里开始,如果我继续前行,我最终会通过 Looper.loop() 类中的消息再次调用 PhoneWindow$DecorView 的 measure()。我猜有些东西排队了一条需要重新测量的消息,比如无效。
我的问题是,需要在视图上进行度量调用的触发因素是什么?
根据我对布局/测量/绘制过程的理解,这只会在特定视图上调用 invalidate() 方法时发生,并且会向下渗透并为该视图执行布局/测量/绘制通道无效及其所有的孩子。我会假设我的视图层次结构中最顶层的视图正在失效。
但是,我已经明确地在我拥有的每个 invalidate 调用上设置了一个断点,并且没有以某种无限的方式调用 invalidate。所以我认为情况并非如此。是否有另一种方法来触发测量通过?内部可能会触发这种情况吗?看到没有什么是无限无效的,我有点想不通。
【问题讨论】:
-
什么意思?如果您在滚动视图中滚动 .. 它会失效.. 您不必致电
invalidate() -
在我的代码中,当我对视图执行无效调用时,有很多明确的点。我要问的是在幕后什么会使措施无效并强制采取措施,以及除无效以外的其他任何措施都会强制采取措施。很高兴知道在 scrollView 中滚动之类的操作会导致无效。