本篇文章給大家分享的是有關(guān)android中handler.post和handler.sendMessage的區(qū)別是什么,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。
創(chuàng)新互聯(lián)建站專注于企業(yè)成都營(yíng)銷網(wǎng)站建設(shè)、網(wǎng)站重做改版、九江網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5場(chǎng)景定制、商城網(wǎng)站制作、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)網(wǎng)站制作、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為九江等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。
1. 異步更新UI
2. 延時(shí)任務(wù)
但是我一直有一個(gè)困惑,就是handler.post(r)這個(gè)方法有什么獨(dú)特的作用?
通過(guò)看源碼發(fā)現(xiàn),post這個(gè)方法是把任務(wù)r轉(zhuǎn)成一個(gè)message放進(jìn)了handler所在的線程中的messageQueue消息隊(duì)列中,并且是立刻發(fā)送的消息,這樣它既不是異步的也不是延時(shí)的,所以問題來(lái)了:
1. 它和sendMessage()有什么區(qū)別?
2. 它有什么獨(dú)特作用呢?
下結(jié)論之前我們先通過(guò)源碼來(lái)分析:
/** * Causes the Runnable r to be added to the message queue. * 這里源碼注釋的意思是:把r這個(gè)任務(wù)對(duì)象添加到消息隊(duì)列中。 */ public final boolean post(Runnable r) { return sendMessageDelayed(getPostMessage(r), 0); } /** * Enqueue a message into the message queue after all pending messages *然后我們接著看post方法中直接調(diào)用到的發(fā)送延時(shí)消息的方法,源碼注釋*的意思是把這個(gè)消息放入消息隊(duì)列, */ public final boolean sendMessageDelayed(Message msg, long delayMillis) { if (delayMillis < 0) { delayMillis = 0; } return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis); } /*最后我們?cè)倏磒ost中調(diào)用的另外一個(gè)方法,源碼中沒有注釋,但我們很容易看出來(lái),這個(gè)方法就是把r這個(gè)任務(wù)包裝成了一個(gè)空的消息并且返回*/ private static Message getPostMessage(Runnable r) { Message m = Message.obtain(); m.callback = r; return m; }
至此,我們可以得出結(jié)論:
handler.post和handler.sendMessage本質(zhì)上是沒有區(qū)別的,都是發(fā)送一個(gè)消息到消息隊(duì)列中,而且消息隊(duì)列和handler都是依賴于同一個(gè)線程的。
接下來(lái)我們?cè)俳Y(jié)合實(shí)際應(yīng)用中的例子來(lái)分析:
分別用sendMessage和post完成同樣的異步更新UI的任務(wù):
private TextView tv_up; private String new_str = ""; /*post方法解決UI更新問題handler創(chuàng)建方式*/ private Handler handler_post = new Handler(); /*sendMessage方法解決UI更新問題handler創(chuàng)建方式*/ Handler handler_senM = new Handler() { public void handleMessage(Message msg) { if (msg.what == 1) { /*sendMessage方法更新UI的操作必須在handler的handleMessage回調(diào)中完成*/ 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更新發(fā)送消息給handler(主線程中的handler)*/ handler_senM.sendEmptyMessage(1); /*post方法解決UI更新,直接在runnable里面完成更新操作,這個(gè)任務(wù)會(huì)被添加到handler所在線程的消息隊(duì)列中,即主線程的消息隊(duì)列中*/ handler_post.post(new Runnable() { @Override public void run() { tv_up.setText(new_str); } }); } }).start(); }
從這段代碼中我們可以看出:
post和sendMessage只是用法上的區(qū)別,本質(zhì)是沒有區(qū)別的。
最終總結(jié):
1. post和sendMessage本質(zhì)上是沒有區(qū)別的,只是實(shí)際用法中有一點(diǎn)差別
2. post也沒有獨(dú)特的作用,post本質(zhì)上還是用sendMessage實(shí)現(xiàn)的,post只是一中更方便的用法而已
以上就是android中handler.post和handler.sendMessage的區(qū)別是什么,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。