91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

android中handler.post和handler.sendMessage的區別是什么

發布時間:2021-06-28 17:00:51 來源:億速云 閱讀:191 作者:Leah 欄目:移動開發

本篇文章給大家分享的是有關android中handler.post和handler.sendMessage的區別是什么,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

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的區別是什么,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

广州市| 蓝山县| 吉首市| 沙田区| 沙湾县| 淮阳县| 延庆县| 隆昌县| 翁源县| 大宁县| 谷城县| 兴和县| 内黄县| 仁布县| 滕州市| 全州县| 昭通市| 临汾市| 扎鲁特旗| 宁国市| 宜兴市| 正镶白旗| 赤峰市| 苏尼特左旗| 曲阳县| 定襄县| 嘉黎县| 浏阳市| 龙井市| 全椒县| 克什克腾旗| 库尔勒市| 台前县| 墨江| 卢湾区| 荃湾区| 沭阳县| 海南省| 安多县| 邮箱| 鱼台县|