View.post 对比 runnable.run
View.post vs runnable.run
我有复合视图 (ConstraintLayout
)。有时这个视图可以改变它的大小,我需要改变父视图中几个视图的可见性。
我在回调中执行 onSizeChanged()
。如果我这样做很简单,像这样:
override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {
super.onSizeChanged(w, h, oldw, oldh)
configurator.constraint()
}
有时视图不会改变它们的可见性。它可以很随机地发生。
但是,如果我使用 post{}
或 doOnPreDraw{}
override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {
super.onSizeChanged(w, h, oldw, oldh)
doOnPreDraw { configurator.constraint() }
}
一切正常。
我想了解为什么会这样。这与方法有什么区别?
onSizeChanged()
不会在主线程上调用,并且无法保证从其他线程到 UI 的任何更新。通过 post()
或 doOnPreDraw()
同步回主线程可解决您所观察到的问题。
我有复合视图 (ConstraintLayout
)。有时这个视图可以改变它的大小,我需要改变父视图中几个视图的可见性。
我在回调中执行 onSizeChanged()
。如果我这样做很简单,像这样:
override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {
super.onSizeChanged(w, h, oldw, oldh)
configurator.constraint()
}
有时视图不会改变它们的可见性。它可以很随机地发生。
但是,如果我使用 post{}
或 doOnPreDraw{}
override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {
super.onSizeChanged(w, h, oldw, oldh)
doOnPreDraw { configurator.constraint() }
}
一切正常。
我想了解为什么会这样。这与方法有什么区别?
onSizeChanged()
不会在主线程上调用,并且无法保证从其他线程到 UI 的任何更新。通过 post()
或 doOnPreDraw()
同步回主线程可解决您所观察到的问题。