从源码与官方文档看之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的更内部的方法。

相关文章
|
消息中间件 Android开发
Handler源码解读——handler使用时的注意事项
工作中经常会遇到从子线程发送消息给主线程,让主线程更新UI的操作,常见的有handler.sendMessage(Message),和handler.post(runnable)和handler.postDelayed(runnable, milliseconds);一直在使用这些方法,却不知道他们的原理,今天就来解释一下他们的原理。
|
消息中间件 Java 调度
从源码与官方文档看之Handler篇(一)
好家伙,写了四篇文章才发现自己看源码的Handle所属的包不一样
|
安全 API
从源码与官方文档看之Handler篇(六)
今天继续看Handler类,构造方法已经基本全部看完,后面应该是一些类的一般方法之类的内容了,继续加油。
|
安全 API 调度
从源码与官方文档看之Handler篇(十)
每次阅读源码,我都想着许多过往云烟,可以说,一切不在一样,不过,想再多又如何,倒不如按下心思,在手中记下这一切更为妥当。还是看看这些充满智慧结晶的源码吧!
|
Java Android开发
从源码与官方文档看之Handler篇(二)
今天又发现自己原来是Handler这个类名打错了导致前面几篇一直再说Java的Handle,而安卓的是Handler,前一篇文章我们主要翻译了安卓官方对Handler的注释,这一篇我们来看看Handler类的一些属性,成员变量。
从源码与官方文档看之Handler篇(七)
接下来就是我们可以正常调用的Handler类方法了,希望早日完成Handler类的源码阅读。
从源码与官方文档看之Handler篇(三)
前面我们说到dispatchMessage方法,今天我们继续往下看源码。
107 0
|
Android开发
从源码与官方文档看之Handler篇(八)
后面更文节奏可以舒缓一些了,每篇文章的篇幅也会长些许。 废话不多说,我们继续看Handler类。
|
安全
从源码与官方文档看之Handler篇(四)
上回我们说到第一个Handler类的含有控制是否异步执行的构造函数,今天我们继续往下阅读,相信能更清楚的了解Handler类的机制。
从源码与官方文档看之Handler篇(五)
尽管前路坎坷,可我们还是继续走了下去,一转眼已经又到了第五篇了,每篇内容较少,所以后面整理完时,会汇总成一篇文章,相信这样做会更具有可读性。