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

首頁 > 系統 > Android > 正文

android handler.post和handler.sendMessage的區別和聯系

2019-12-12 02:17:49
字體:
來源:轉載
供稿:網友

現在大部分人都很熟悉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的區別和聯系,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 搜索| 闸北区| 长治市| 台江县| 灌南县| 蓝田县| 巫溪县| 宁明县| 出国| 四子王旗| 什邡市| 德安县| 泊头市| 若羌县| 晴隆县| 淳安县| 石台县| 肃北| 金寨县| 日喀则市| 十堰市| 屏东县| 宁海县| 徐州市| 新邵县| 固始县| 汽车| 五家渠市| 阿拉善盟| 沈阳市| 宁国市| 延边| 云和县| 晴隆县| 莫力| 乐清市| 沭阳县| 阳新县| 汪清县| 乌拉特后旗| 蓬安县|