編輯:關於Android編程
現在大部分人都很熟悉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 基礎(十一)) Snackbar
介紹Snackbars provide lightweight feedback about an operation. They show a brief messag
Android實現圖片疊加效果的兩種方法
本文實例講述了Android實現圖片疊加效果的兩種方法。分享給大家供大家參考,具體如下:效果圖:第一種:第二種:第一種是通過canvas畫出來的效果:public voi
探究startActivityForResult在singleTop和singleTask啟動模式討論
最近在研究AMS代碼遇到一個問題,在函數startActivityUncheckedLocked中 Slog.d("DDY", "!!
Android Studio -修改LogCat的顏色*美爆了*
一、 先看效果二、設置 File->Settings 或Ctrl + Alt +S 找到 Editor -> Colors &Fonts ->