android handler.post和handler.sendMessage的區(qū)別和聯(lián)系
現(xiàn)在大部分人都很熟悉handler這個(gè)東西了,我們常用handler的場景無非有兩個(gè):
1. 異步更新UI
2. 延時(shí)任務(wù)
但是我一直有一個(gè)困惑,就是handler.post(r)這個(gè)方法有什么獨(dú)特的作用?
通過看源碼發(fā)現(xiàn),post這個(gè)方法是把任務(wù)r轉(zhuǎn)成一個(gè)message放進(jìn)了handler所在的線程中的messageQueue消息隊(duì)列中,并且是立刻發(fā)送的消息,這樣它既不是異步的也不是延時(shí)的,所以問題來了:
1. 它和sendMessage()有什么區(qū)別?
2. 它有什么獨(dú)特作用呢?
下結(jié)論之前我們先通過源碼來分析:
/**
* Causes the Runnable r to be added to the message queue.
* 這里源碼注釋的意思是:把r這個(gè)任務(wù)對象添加到消息隊(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);
}
/*最后我們再看post中調(diào)用的另外一個(gè)方法,源碼中沒有注釋,但我們很容易看出來,這個(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è)線程的。
接下來我們再結(jié)合實(shí)際應(yīng)用中的例子來分析:
分別用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ù)會被添加到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只是一中更方便的用法而已
總結(jié)
以上所述是小編給大家介紹的android handler.post和handler.sendMessage的區(qū)別和聯(lián)系,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
Android實(shí)現(xiàn)淘寶底部圖標(biāo)導(dǎo)航欄
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)淘寶底部圖標(biāo)導(dǎo)航欄,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12
Android手勢密碼實(shí)現(xiàn)實(shí)例代碼
本篇文章主要介紹了Android手勢密碼實(shí)現(xiàn)實(shí)例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-04-04
Android監(jiān)聽滑動(dòng)控件實(shí)現(xiàn)狀態(tài)欄顏色切換
這篇文章給大家分享一個(gè)平時(shí)在滑動(dòng)頁面經(jīng)常遇到的效果:滑動(dòng)過程動(dòng)態(tài)修改狀態(tài)欄顏色,文中有詳細(xì)的示例代碼,對我們的學(xué)習(xí)或工作有一定的幫助,感興趣的小伙伴自己動(dòng)手試試吧2023-08-08
Android在OnCreate中獲取控件的寬度和高度的實(shí)現(xiàn)代碼
在Android中,有時(shí)需要對控件進(jìn)行測量,得到的控件寬度和高度可以用來做一些計(jì)算。在需要自適應(yīng)屏幕的情況下,這種計(jì)算就顯得特別重要2012-11-11
Android編程實(shí)現(xiàn)圖片的顏色處理功能示例
這篇文章主要介紹了Android編程實(shí)現(xiàn)圖片的顏色處理功能,涉及Android拖動(dòng)條的使用及圖形顏色處理相關(guān)操作技巧,需要的朋友可以參考下2018-02-02
Android手機(jī)衛(wèi)士之綁定sim卡序列號
這篇文章主要介紹了Android手機(jī)衛(wèi)士之綁定sim卡序列號的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10
Android下通過httpClient發(fā)送GET和POST請求的實(shí)例代碼
這篇文章介紹了Android下通過httpClient發(fā)送GET和POST請求的實(shí)例代碼,有需要的朋友可以參考一下2013-08-08
通過實(shí)例簡單講解Android App中的Activity組件
這篇文章主要介紹了通過Android App中的Activity組件,包括Activity的定義和繼承以及啟動(dòng)等基本知識,需要的朋友可以參考下2016-04-04

