从源码与官方文档看之Handler篇(九)

简介: 今天我们来详细看看Handler的post()方法吧

正篇

看到了很多掘友们留言说Android是江河日下,可我已经在这个行业,如果不把这行做好,我哪能再有心思想别的,而且我相信就算以后不做这行,我相信去学习源码也是对我有帮助的,新人也是好不容易有一份工作的,暂时一年半载肯定不会有更多的想法的,好好加油,先把安卓学好。

多余的话就不说了,我们接着来看代码:

/**
 * Causes the Runnable r to be added to the message queue.
 * The runnable will be run on the thread to which this handler is 
 * attached. 
 *  
 * @param r The Runnable that will be executed.
 * 
 * @return Returns true if the Runnable was successfully placed in to the 
 *         message queue.  Returns false on failure, usually because the
 *         looper processing the message queue is exiting.
 */
public final boolean post(@NonNull Runnable r) {
   return  sendMessageDelayed(getPostMessage(r), 0);
}

这个是第一个post方法,它的注释大意为:

让 Runnable类型的参数 r 添加到消息队列中。 可运行的对象将会在附加此handler的线程上运行。

其中参数: r 代表将被执行的 Runnable对象

返回结果: 如果 Runnable 对象已成功放入消息队列,则返回 true,

如果失败就返回 false,这点通常是因为处理消息队列的 looper 正在退出的结束流程中。

也就是说,这个方法为我们提供了一个方式,让我们将不为空的Runnable运行,即可以在子线程里运行UI线程的处理,当然,这个方法是不做延时操作的。

延时操作的post在下面的这些方法中:

public final boolean postAtTime(@NonNull Runnable r, long uptimeMillis) {
    return sendMessageAtTime(getPostMessage(r), uptimeMillis);
}
public final boolean postAtTime(
        @NonNull Runnable r, @Nullable Object token, long uptimeMillis) {
    return sendMessageAtTime(getPostMessage(r, token), uptimeMillis);
}

这两个方法是用于确定了延迟的绝对时间(使用SystemClock.uptimeMillis时基)后,到该时间后进行程序处理。 还有:

public final boolean postDelayed(@NonNull Runnable r, long delayMillis) {
    return sendMessageDelayed(getPostMessage(r), delayMillis);
}
/** @hide */
public final boolean postDelayed(Runnable r, int what, long delayMillis) {
    return sendMessageDelayed(getPostMessage(r).setWhat(what), delayMillis);
}
public final boolean postDelayed(
        @NonNull Runnable r, @Nullable Object token, long delayMillis) {
    return sendMessageDelayed(getPostMessage(r, token), delayMillis);
}

这三个是使用参数delayMillis – 以执行 Runnable 之前的延迟(以毫秒为单位)的相对时间即多少毫秒后执行的post方法。其中,上述的方法中含有Object对象token参数的意思是用于通过removeCallbacksAndMessages取消r的实例。

而这些boolean方法的返回注释大意为:如果 Runnable 已成功放入消息队列,则返回 true。失败时返回 false,通常是因为处理消息队列的 looper 正在退出。请注意,结果为 true 并不意味着 Runnable 将被处理——如果在消息的传递时间发生之前退出 looper,则消息将被丢弃。

还有最后一个post方法:

public final boolean postAtFrontOfQueue(@NonNull Runnable r) {
    return sendMessageAtFrontOfQueue(getPostMessage(r));
}

方法注释的大意为向实现 Runnable 的对象发布消息,使 Runnable r 在消息队列的下一次迭代中执行。

可运行对象将在附加此处理程序的线程上运行。

而且这种方法一般只在非常特殊的情况下使用, 这是因为它很容易使消息队列饿死,导致排序问题,或者有其他意想不到的副作用。反正我没用过这个方法。 最常用的还是这两个方法:

public final boolean postDelayed(@NonNull Runnable r, long delayMillis) {
    return sendMessageDelayed(getPostMessage(r), delayMillis);
}
/** @hide */
public final boolean postDelayed(Runnable r, int what, long delayMillis) {
    return sendMessageDelayed(getPostMessage(r).setWhat(what), delayMillis);
}

一个我常用于子线程延迟时间向主线程发消息,一个是延迟程序块运行时间

当然,最开始的: public final boolean post(@NonNull Runnable r) 方法也是蛮常用的,而我们也看到,这些方法的返回都是介于sendMessageXXX方法的,而这个方法中都定义了

MessageQueue queue = mQueue;

所以我们不需要传递消息队列进来,下一篇我们会去分析一下这些被用于post方法的return的更内部的方法。

相关文章
|
5月前
|
自然语言处理 监控 UED
2026年企业如何把智能客服系统用好?人机协同+打通业务数据实现降本增效落地指南
本文剖析智能客服“上线≠用好”的症结,指出降本增效关键在于人机协同(系统处理重复事务,人工专注复杂判断与情感沟通)与业务数据贯通(联动订单、会员、物流等实时信息)。结合瓴羊Quick Service实践,系统梳理四大基础动作与四阶段落地路径,助力企业实现可衡量的服务升级。(239字)
|
6月前
|
存储 安全 算法
ThreadLocal 90% 开发者都踩过的坑:底层原理拆解、内存泄漏根治与架构级用法全解
本文深度解析ThreadLocal底层原理(JDK17源码级),直击多线程上下文串号、线程池OOM、traceId传递失效等高频痛点,详解内存泄漏本质(弱引用实为兜底优化)、根治方案(强制remove)及TTL等生产级实践,涵盖用户/trace/事务/数据源四大上下文场景与七大避坑指南。
636 2
|
10月前
|
人工智能 小程序 定位技术
别让客人“刷”不到你:本地生活GEO布局的4个土办法
别让客人“刷”不到你!本地生活商家必须掌握的GEO四步土办法:画清3公里人群圈、结构化信息让AI秒懂、用顾客原话做内容、每月删旧更新。精准触达AI推荐,把客流引到店门口。(238字)
892 0
|
存储 数据采集 数据挖掘
Python数据分析实验一:Python数据采集与存储
Python数据分析实验一:Python数据采集与存储
|
人工智能 JavaScript 前端开发
借助 CodeBuddy,我轻松开发出三分钟读书 App
借助 CodeBuddy,我轻松开发出三分钟读书 App
429 6
|
前端开发 JavaScript 定位技术
三、前端高德地图、测量两个点之前的距离
文章介绍了如何在前端使用高德地图API实现测量两个点之间的距离,包括开启和关闭测量工具的方法,以及如何清除地图上的测量点、连线和文字。
1046 2
三、前端高德地图、测量两个点之前的距离
|
存储 人工智能 缓存
Mooncake:月之暗面Kimi联合清华等机构推出的大模型推理架构
Mooncake是由月之暗面Kimi联合清华大学等机构共同开源的大模型推理架构。该架构以KVCache为中心,通过分布式设计和资源优化,显著提升了大模型推理的吞吐量和效率,同时降低了算力开销。Mooncake在长上下文场景中表现出色,支持多种应用场景,如自然语言处理、内容推荐系统和搜索引擎等。
2195 6
Mooncake:月之暗面Kimi联合清华等机构推出的大模型推理架构
|
人工智能 算法 物联网
AI大模型爆火背后,C++ 如何助力 AI 开发大显身手?
AI大模型爆火背后,C++ 如何助力 AI 开发大显身手?
|
JSON 数据格式 Python
py如何把字符串转出json
py如何把字符串转出json
464 0
|
移动开发 JavaScript 前端开发
uniapp中nvue与vue的区别?
uniapp中nvue与vue的区别?
853 0