android handler.post和handler.sendMessage的區(qū)別和聯(lián)系
現(xiàn)在大部分人都很熟悉handler這個東西了,我們常用handler的場景無非有兩個:
1. 異步更新UI
2. 延時任務
但是我一直有一個困惑,就是handler.post(r)這個方法有什么獨特的作用?
通過看源碼發(fā)現(xiàn),post這個方法是把任務r轉成一個message放進了handler所在的線程中的messageQueue消息隊列中,并且是立刻發(fā)送的消息,這樣它既不是異步的也不是延時的,所以問題來了:
1. 它和sendMessage()有什么區(qū)別?
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方法中直接調用到的發(fā)送延時消息的方法,源碼注釋*的意思是把這個消息放入消息隊列, */ 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本質上是沒有區(qū)別的,都是發(fā)送一個消息到消息隊列中,而且消息隊列和handler都是依賴于同一個線程的。
接下來我們再結合實際應用中的例子來分析:
分別用sendMessage和post完成同樣的異步更新UI的任務:
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回調中完成*/ 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里面完成更新操作,這個任務會被添加到handler所在線程的消息隊列中,即主線程的消息隊列中*/ handler_post.post(new Runnable() { @Override public void run() { tv_up.setText(new_str); } }); } }).start(); }
從這段代碼中我們可以看出:
post和sendMessage只是用法上的區(qū)別,本質是沒有區(qū)別的。
最終總結:
1. post和sendMessage本質上是沒有區(qū)別的,只是實際用法中有一點差別
2. post也沒有獨特的作用,post本質上還是用sendMessage實現(xiàn)的,post只是一中更方便的用法而已
總結
以上所述是小編給大家介紹的android handler.post和handler.sendMessage的區(qū)別和聯(lián)系,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關文章
Android監(jiān)聽滑動控件實現(xiàn)狀態(tài)欄顏色切換
這篇文章給大家分享一個平時在滑動頁面經(jīng)常遇到的效果:滑動過程動態(tài)修改狀態(tài)欄顏色,文中有詳細的示例代碼,對我們的學習或工作有一定的幫助,感興趣的小伙伴自己動手試試吧2023-08-08Android在OnCreate中獲取控件的寬度和高度的實現(xiàn)代碼
在Android中,有時需要對控件進行測量,得到的控件寬度和高度可以用來做一些計算。在需要自適應屏幕的情況下,這種計算就顯得特別重要2012-11-11Android下通過httpClient發(fā)送GET和POST請求的實例代碼
這篇文章介紹了Android下通過httpClient發(fā)送GET和POST請求的實例代碼,有需要的朋友可以參考一下2013-08-08通過實例簡單講解Android App中的Activity組件
這篇文章主要介紹了通過Android App中的Activity組件,包括Activity的定義和繼承以及啟動等基本知識,需要的朋友可以參考下2016-04-04