android handler.post和handler.sendMessage的区别和联系
程序员文章站
2023-12-05 23:21:28
现在大部分人都很熟悉handler这个东西了,我们常用handler的场景无非有两个:
1. 异步更新ui
2. 延时任务
但是我一直有一个困惑,就是handler....
现在大部分人都很熟悉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); } }; }; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); new thread(new runnable() { @override public void run() { new_str = "更新ui"; /*sendmessage方法解决ui更新发送消息给handler(主线程中的handler)*/ handler_senm.sendemptymessage(1); /*post方法解决ui更新,直接在runnable里面完成更新操作,这个任务会被添加到handler所在线程的消息队列中,即主线程的消息队列中*/ handler_post.post(new runnable() { @override public void run() { tv_up.settext(new_str); } }); } }).start(); }
从这段代码中我们可以看出:
post和sendmessage只是用法上的区别,本质是没有区别的。
最终总结:
1. post和sendmessage本质上是没有区别的,只是实际用法中有一点差别
2. post也没有独特的作用,post本质上还是用sendmessage实现的,post只是一中更方便的用法而已
总结
以上所述是小编给大家介绍的android handler.post和handler.sendmessage的区别和联系,希望对大家有所帮助
上一篇: 了解无线加密的多种方法及其区别
推荐阅读
-
android handler.post和handler.sendMessage的区别和联系
-
android中Invalidate和postInvalidate的更新view区别
-
Android 启动 Service(startservice和bindservice) 两种方式的区别
-
Android MotionEvent中getX()和getRawX()的区别实例详解
-
Android中dip、dp、sp、pt和px的区别详解
-
C#中前台线程和后台线程的区别与联系
-
Android applicationId和包名的区别总结
-
awk中RS、ORS、FS、OFS的区别和联系小结
-
android handler.post和handler.sendMessage的区别和联系
-
jQuery对象与DOM对象的区别和联系