- 从安卓7.0 系统(API24)开始View#post还是比较好理解的,简单来说就是当该View被attach到某个Window过才会执行该View post的Runnable中的代码。如果调用post的时候该View已经附加到某个Window上,那么会将Runnable post到UI线程中,如果调用post的时候该View还未被添加到任何Window中,那么会将其存储起来,等待附加的时候执行。所以如果post某个Runnable,但是从未将该View添加到某个窗口中,那么该Runable中的代码将永远不会被执行。注意这和7.0以下的永远不被执行的情况不同,这种情况是符合常理的,因为可以认为一个不依附任何Window的View是没有意义的,此时它只是一个简单的java类,不应该具备视图的功能。
- 对于7.0以下系统:当调用post时如果该View已经attach到了某个Window上,此时和7.0系统处理逻辑是一样的;如果调用post的时候该View还未被添加到任何Window中,那么会将Runnable存储起来,等待下一次执行performTraversals时执行,如果post是在子线程中调用的,那么其方法体中的代码将永远不会被执行,如果是在UI线程中调用的那么会在下一次performTraversals时执行。所以在7.0以下系统一定要注意确保View被attach到某个Window之后,在调用其post方法,否则post的Runnable中的代码很可能不会执行,尤其是如果post在子线程中调用那么可以肯定永远不会执行。
- 当View被attach到某个Window上后,其效果等同于Handler#post,此时2者可以认为等价
可能,你还想了解View.dispatchAttachedToWindow和ViewRootImpl.performTraversals