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() 同步回主线程可解决您所观察到的问题。