简介

View.post(Runnable)是 Android View 类提供的一个方法,**用于在主线程(UI 线程)上执行指定的 Runnable 任务。**它会将一个 Runnable 任务加入到 View 所在的消息队列(Message Queue)中,任务会在 View 完成布局并准备好绘制时(通常在下一次 UI 线程的绘制周期)异步执行。

基本用法

view.post(new Runnable() {
    @Override
    public void run() {
        // 这里的代码会在主线程执行
        view.setText("更新UI");
    }
});
  1. 安全地更新 UI:从非 UI 线程安全地更新 UI 元素
  2. 获取正确的 View 尺寸:在 Activity 的onCreate()中获取 View 的宽高时,使用 post 可以确保 View 已经完成测量。

工作原理

  • 当调用view.post(runnable)时,Runnable 会被放入 UI 线程的消息队列。UI 线程会在适当的时机(通常是 View 已完成测量和布局后)执行该 Runnable。

Info

  1. 如果 View 已经附加到窗口(即已经完成测量和布局),Runnable 会立即被发送到主线程的消息队列执行
  2. 如果 View 还未附加到窗口,Runnable 会被缓存,等到 View 附加到窗口后再执行
  • 在 Runnable 运行时,View 的尺寸(如getWidth()getHeight())和位置(如getLocationOnScreen())通常已经可用。

与Handler.post()的区别

这两个方法底层原理一致,都是将任务投递到主线程 Looper 消息队列。

方法依赖
View.post(Runnable)等价于 Handler(Looper.getMainLooper()).post()
,内部也是这么实现的
Handler.post(Runnable)你可以明确指定在哪个线程运行任务,适用于自定义线程或主线程

注意事项

  1. 如果 View 从未附加到窗口(如 Activity 已被销毁),缓存的 Runnable 将不会执行
  2. 长时间运行的任务不应放在这里执行,以免阻塞UI线程
  3. 在 Fragment 中使用时要注意生命周期问题

更新: 2025-07-14 11:04:35
原文: https://www.yuque.com/dongpozhouzi-mshe3/zhm85g/osz1g35d5melfgn8


相关笔记