【发布时间】:2014-02-21 14:32:33
【问题描述】:
第一件事!我确实知道ViewTreeObserver.onGlobalLayoutListener。
让我问这个问题的是 Android 开发者文档网站上的以下通知:
下面的 sn-p 做了以下事情:
- 获取父视图并在 UI 线程上发布 Runnable。 这可确保父级在调用 getHitRect() 方法。 getHitRect() 方法获取孩子的命中 父坐标中的矩形(可触摸区域)。
片段本身是:
parentView.post(new Runnable() {
// Post in the parent's message queue to make sure the parent
// lays out its children before you call getHitRect()
@Override
public void run() {
/// do UI stuff
}
});
(可以看full article)
那么这是一个错误的陈述还是真的? 我之所以问,是因为与使用 ViewTreeObserver 进行所有注册侦听器/处理事件/取消注册侦听器舞蹈相比,发布可运行文件似乎更容易、更方便:)
更新:还有一个问题可以使整个主题更加清晰:
如果这一切都很好,并且 Runnable 实际上可以发布而不是使用全局布局侦听器,那么为什么我们还有这个 ViewTreeObserver.onGlobalLayoutListener 机制呢?什么时候使用它而不是发布 Runnable 更好,这些方法之间有什么区别?
【问题讨论】:
-
使用Runnable,运行时你处于布局阶段之后
-
很好的问题,并同意它比观察者更好。您可以通过在 onCreate() 中发布它来测试这一点,在 run() 中更改 UI 元素的布局,然后在发布后也更改相同的布局,也在 onCreate() 中。如果 runnable 确实在布局之后发生,您应该在 runnable 中看到布局更改,而不是 onCreate() 中的那个?????对“如何将两个数字相加”、“nullPointerException”和“为什么我会丢失 ; 符号语法错误”做出了很好的改变。
-
这是我通常使用的方式。例如,如果我需要获取 View 的大小,我必须等到整个层次结构绘制完毕。所以我通常采用根布局并发布可运行文件。这样我就可以确定当我的 runnable 被执行时,布局至少已经被测量过了。
-
@Simon,是的,或者只是检查 UI 组件的 getWidth(),它不应该是 0 :)
-
@pskink,blackbelt 是的,似乎大部分时间都有效,但我很好奇某处是否有关于此的“官方”声明:)
标签: android multithreading android-layout