国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 系統(tǒng) > Android > 正文

android handler.post和handler.sendMessage的區(qū)別和聯(lián)系

2019-10-22 18:30:27
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

現(xiàn)在大部分人都很熟悉handler這個(gè)東西了,我們常用handler的場(chǎng)景無(wú)非有兩個(gè):

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í)的,所以問(wèn)題來(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è)方法,源碼中沒(méi)有注釋,但我們很容易看出來(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ì)上是沒(méi)有區(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更新問(wèn)題handler創(chuàng)建方式*/  private Handler handler_post = new Handler();  /*sendMessage方法解決UI更新問(wèn)題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ì)是沒(méi)有區(qū)別的。

最終總結(jié):

1. post和sendMessage本質(zhì)上是沒(méi)有區(qū)別的,只是實(shí)際用法中有一點(diǎn)差別

2. post也沒(méi)有獨(dú)特的作用,post本質(zhì)上還是用sendMessage實(shí)現(xiàn)的,post只是一中更方便的用法而已

總結(jié)

以上所述是小編給大家介紹的android handler.post和handler.sendMessage的區(qū)別和聯(lián)系,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)VEVB武林網(wǎng)網(wǎng)站的支持!


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到Android開(kāi)發(fā)頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 轮台县| 桐城市| 盘山县| 绥棱县| 和顺县| 金溪县| 宝鸡市| 大名县| 黄冈市| 红安县| 济阳县| 东乌珠穆沁旗| 杭锦旗| 丰原市| 芦山县| 蒙城县| 库尔勒市| 怀来县| 贺州市| 磐石市| 马关县| 哈巴河县| 建瓯市| 信阳市| 陆良县| 黎城县| 新绛县| 大同县| 银川市| 德格县| 巴中市| 长汀县| 怀柔区| 仁怀市| 秭归县| 杭锦旗| 望奎县| 清远市| 察隅县| 台东县| 兴义市|