最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2017年08月08日 11:32:42   作者:浪浪的程序猿  
handler.post和handler.sendMessage本質(zhì)上是沒有區(qū)別的,都是發(fā)送一個(gè)消息到消息隊(duì)列中,而且消息隊(duì)列和handler都是依賴于同一個(gè)線程的。接下來通過本文給大家分享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ù)會(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只是一中更方便的用法而已

總結(jié)

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

相關(guān)文章

  • 簡單實(shí)現(xiàn)Android應(yīng)用的啟動(dòng)頁

    簡單實(shí)現(xiàn)Android應(yīng)用的啟動(dòng)頁

    這篇文章主要介紹了簡單實(shí)現(xiàn)Android應(yīng)用的啟動(dòng)頁,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09
  • AndroidManifest.xml配置文件解析

    AndroidManifest.xml配置文件解析

    AndroidManifest.xml配置文件對于Android應(yīng)用開發(fā)來說是非常重要的基礎(chǔ)知識(shí),本文將詳細(xì)介紹,需要了解的朋友可以參考下
    2012-12-12
  • Android錄音時(shí)獲取分貝值的方法代碼實(shí)例

    Android錄音時(shí)獲取分貝值的方法代碼實(shí)例

    這篇文章主要介紹了Android錄音時(shí)獲取分貝值的方法代碼實(shí)例,本文直接給出核心實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2015-04-04
  • Android實(shí)現(xiàn)自由拖動(dòng)并顯示文字的懸浮框

    Android實(shí)現(xiàn)自由拖動(dòng)并顯示文字的懸浮框

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)自由拖動(dòng)并顯示文字的懸浮框,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-01-01
  • Android自定義View實(shí)現(xiàn)圓形加載進(jìn)度條

    Android自定義View實(shí)現(xiàn)圓形加載進(jìn)度條

    這篇文章主要為大家詳細(xì)介紹了Android自定義View實(shí)現(xiàn)圓形加載進(jìn)度條,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • Android可篩選的彈窗控件CustomFiltControl

    Android可篩選的彈窗控件CustomFiltControl

    這篇文章主要為大家詳細(xì)介紹了Android可篩選的彈窗控件CustomFiltControl,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • Android List刪除重復(fù)數(shù)據(jù)

    Android List刪除重復(fù)數(shù)據(jù)

    這篇文章主要介紹了Android List刪除重復(fù)數(shù)據(jù)的實(shí)例代碼,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧
    2017-06-06
  • Android自定義控件實(shí)現(xiàn)帶文字提示的SeekBar

    Android自定義控件實(shí)現(xiàn)帶文字提示的SeekBar

    這篇文章主要給大家介紹了關(guān)于Android自定義控件實(shí)現(xiàn)帶文字提示的SeekBar的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-12-12
  • 基于SurfaceView實(shí)現(xiàn)可拖動(dòng)視頻控件

    基于SurfaceView實(shí)現(xiàn)可拖動(dòng)視頻控件

    這篇文章主要為大家詳細(xì)介紹了基于SurfaceView的可拖動(dòng)視頻控件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • Android ViewPager源碼詳細(xì)分析

    Android ViewPager源碼詳細(xì)分析

    這篇文章主要為大家詳細(xì)介紹了Android ViewPager源碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-02-02

最新評論

湄潭县| 屯门区| 保定市| 合山市| 武功县| 调兵山市| 当阳市| 贺兰县| 西充县| 松桃| 盘锦市| 大同县| 元氏县| 腾冲县| 德格县| 神农架林区| 凤庆县| 弥渡县| 云和县| 准格尔旗| 吉木萨尔县| 曲阳县| 道真| 武宣县| 锡林郭勒盟| 彰化县| 瑞丽市| 阜新市| 孝昌县| 曲沃县| 道孚县| 灵丘县| 襄城县| 大同市| 宜丰县| 大港区| 恩施市| 永宁县| 阳高县| 蚌埠市| 红安县|