现在大部分人都很熟悉handler这个东西了,我们常用handler的场景无非有两个:
1. 异步更新UI
2. 延时任务
但是我一直有一个困惑,就是handler.post(r)这个方法有什么独特的作用?
通过看源码发现,post这个方法是把任务r转成一个message放进了handler所在的线程中的messageQueue消息队列中,并且是立刻发送的消息,这样它既不是异步的也不是延时的,所以问题来了:
1. 它和sendMessage()有什么区别?
2. 它有什么独特作用呢?

下结论之前我们先通过源码来分析:

/*** Causes the Runnable r to be added to the message queue.* 这里源码注释的意思是:把r这个任务对象添加到消息队列中。*/public final boolean post(Runnable r){return  sendMessageDelayed(getPostMessage(r), 0);}/*** Enqueue a message into the message queue after all pending messages
*然后我们接着看post方法中直接调用到的发送延时消息的方法,源码注释*的意思是把这个消息放入消息队列,*/public final boolean sendMessageDelayed(Message msg, long delayMillis){if (delayMillis < 0) {delayMillis = 0;}return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis);}/*最后我们再看post中调用的另外一个方法,源码中没有注释,但我们很容易看出来,这个方法就是把r这个任务包装成了一个空的消息并且返回*/
private static Message getPostMessage(Runnable r) {Message m = Message.obtain();m.callback = r;return m;
}

至此,我们可以得出结论:
handler.post和handler.sendMessage本质上是没有区别的,都是发送一个消息到消息队列中,而且消息队列和handler都是依赖于同一个线程的。

接下来我们再结合实际应用中的例子来分析:
分别用sendMessage和post完成同样的异步更新UI的任务:

private TextView tv_up;private String new_str = "";/*post方法解决UI更新问题handler创建方式*/private Handler handler_post = new Handler();/*sendMessage方法解决UI更新问题handler创建方式*/Handler handler_senM = new Handler() {public void handleMessage(Message msg) {if (msg.what == 1) {/*sendMessage方法更新UI的操作必须在handler的handleMessage回调中完成*/tv_up.setText(new_str);}};};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);new Thread(new Runnable() {@Overridepublic void run() {new_str = "更新UI";/*sendMessage方法解决UI更新发送消息给handler(主线程中的handler)*/handler_senM.sendEmptyMessage(1);/*post方法解决UI更新,直接在runnable里面完成更新操作,这个任务会被添加到handler所在线程的消息队列中,即主线程的消息队列中*/handler_post.post(new Runnable() {@Overridepublic void run() {tv_up.setText(new_str);}});}}).start();}

从这段代码中我们可以看出:
post和sendMessage只是用法上的区别,本质是没有区别的。

最终总结:
1. post和sendMessage本质上是没有区别的,只是实际用法中有一点差别
2. post也没有独特的作用,post本质上还是用sendMessage实现的,post只是一中更方便的用法而已

handler.post和handler.sendMessage的区别和联系相关推荐

  1. Android Handler Runnable和Thread之间的区别和联系详解

    在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口:Thread类是在java.lang包中定义的.一个类只要继承了Thread类同时覆写了本类中的run() ...

  2. Android开发:Handler Runnable和Thread之间的区别和联系 应用--------------------看完本篇,从此一览无余!...

    http://blog.csdn.net/yanzi1225627/article/details/8582081 在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnab ...

  3. Android Hander post与sendMessage的区别

    Android Hander post与sendMessage的区别 post Message缓存相关 SDK 29 post 1. post方法其实与sendMassage方法一样,都会调用 sen ...

  4. Handler完全解读——Handler的使用

    个人博客:https://blog.N0tExpectErr0r.cn 小专栏:https://xiaozhuanlan.com/N0tExpectErr0r Handler完全解读--Handler ...

  5. gen_event中的handler和supervised handler

    呃,在gen_event中有两个添加handler的方法 gen_event:add_handler/3 gen_event:add_sup_handler/3 一开始总是有些迷惑两者的区别,今天查看 ...

  6. 【Android 异步操作】手写 Handler ( Handler 发送与处理消息 | Handler 初始化 | 完整 Handler 代码 )

    文章目录 一.Handler 发送与处理消息 ( 两大功能 ) 二.Handler 初始化 三.完整 Handler 代码 一.Handler 发送与处理消息 ( 两大功能 ) Handler 有两个 ...

  7. 【Android 异步操作】Handler ( 主线程中的 Handler 与 Looper | Handler 原理简介 )

    文章目录 一.主线程中的 Handler 与 Looper 二.Handler 原理简介 一.主线程中的 Handler 与 Looper Android 系统中 , 点击图标启动一个应用进程 , 就 ...

  8. 安卓handler的用法,handler举例

    原帖跳转: link 一.Handler的定义: Handler主要接收子线程发送的数据, 并用此数据配合主线程更新UI,用来跟UI主线程交互用.比如可以用handler发送一个message,然后在 ...

  9. android handler内存,Android handler之内存泄露原因揭示

    关于handler机制大家可以看前面专题Android面试精选--再聊android Handler机制.今天我们要说的重点是 handler为什么会发生内存泄露? 我们先从源头说起,应用刚启动时,第 ...

最新文章

  1. ajax提交数据服务端返回报错
  2. linux下查看线程数的几种方法
  3. 5个杰出的商业机器学习用例
  4. Android开发之拍照功能实现
  5. 关于SAP Cloud for Customer Cloud Application Studio登录失败的问题
  6. 论文阅读01:大规模人脸图像检索的深度度量哈希
  7. 运行linux脚本出现/usr/bin/env: ‘python\r’: No such file or directory
  8. GB28181协议--校时
  9. Redhat 7.2 安装网卡驱动
  10. VUE中的img的:src动态加载图片的问题,require也不能随便用
  11. Vanishing Point Constrained Lane DetectionWith a Stereo Camera (IEEE 2017)
  12. Dfinity (ICP)开发基本操作-4
  13. 高数量类别特征(high-cardinality categorical attributes)的预处理方法
  14. VLC Plugin JS 方法
  15. XXL-JOB适配人大金仓数据库kingbase
  16. 市场调查与预测试题库【1】
  17. 0-1背包问题和部分背包(fractional knapsack)问题分析
  18. Eclipse方没有提示解决办法
  19. python:根据头数和脚数,求多少只兔子和多少只鸡(附完整源码)
  20. 机械键盘买青轴好还是茶轴好?

热门文章

  1. 手机广告 开源SNS
  2. Docker常用容器命令
  3. 前端入门之(我与iscroll的不期而遇)
  4. 正则(?=)(?:)
  5. [1996 TRO] Probabilistic Roadmaps for Path Planning in High-Dimensional Configuration Spaces
  6. 迈向更小的.NET 4-有关客户端配置文件和下载.NET的详细信息
  7. 刀片计算机学习资料第192篇:6U VPX i7 刀片计算机
  8. latex数字引用参考文献
  9. 七牛云 Java Web上传图片
  10. 关于Mastering-OpenCV3第二版的代码跑通--关于PCL的一些问题