android thread教學 何時使用handler.post()&何時使用新的Thread()




handlerthread handlemessage (4)

我想知道什麼時候應該使用handler.post(runnable); 什麼時候我應該使用new Thread(runnable).start();

在Handler的開發人員文檔中提到:

導致Runnable r添加到消息隊列中。 runnable將在連接此處理程序的線程上運行。

如果我在Activity類的onCreate()中寫入,這是否意味著:

Handler handler = new Handler();
handler.post(runnable);

然後runnable將在一個單獨的線程或Activity的線程中調用?


舉例:

mHandler = new Handler();
new Thread(new Runnable(){
  @Override
  public void run () {
    mHandler.post(new Runnable() {
     @Override
     public void run () {
       mUiView.setX(x);
     }
    });
  }
}).start();

或者,您可以跳過處理程序並直接在視圖上使用post方法:

new Thread(new Runnable(){
  @Override
  public void run () {
    mUiView.post(new Runnable() {
     @Override
     public void run () {
       mUiView.setX(x);
     }
    });
  }
}).start();

這是一個很好的帖子,概述了差異: post方法究竟做了什麼?


為了回答你的具體問題:

這是否意味著如果在我寫的onCreate of Activity類中:

處理程序處理程序= new Handler()hanlder.post(runnable); 那麼,runnable將在一個單獨的線程中調用還是在Activity的線程上調用?

不,它不會。 Runnable將在主線程本身上調用。 Handler僅用於將消息發佈到它所附加的線程(創建它的位置)。 它不會自己創建一個線程。 在您的示例中,您在主Thread(調用Activity.OnCreate()的位置)中創建了一個Handler,因此在此類Handler上發布的任何消息都將僅在主線程上運行。


當你想將代碼(通常是從後台線程)發佈主線程時,使用handler.post() 。 是的,POST,就像你一樣,給某人發一封信。 在處理程序的幫助下,代碼將盡快執行,即幾乎立即執行。


每當要在UI線程中執行操作時,都應該使用Handler.post()

所以讓我們說回調(在單獨的線程中運行)你想要改變TextView的文本,你應該使用Handler.post()

在Android中,與許多其他UI框架一樣,UI元素(窗口小部件)只能從主線程修改。

編輯:長時間運行任務的示例

mHandler = new Handler();

new Thread(new Runnable() {
  @Override
  public void run () {
    // Perform long-running task here
    // (like audio buffering).
    // you may want to update some progress
    // bar every second, so use handler:
    mHandler.post(new Runnable() {
     @Override
     public void run () {
       // make operation on UI - on example
       // on progress bar.
     }
    });
  }
}).start();

當然,如果您要執行的任務非常長並且用戶可能在此期間切換到其他應用程序的風險,則應考慮使用Service





android-thread