2013-02-28 30 views
40

我不知道什麼時候應該使用handler.post(runnable);,當我應該使用 new Thread(runnable).start();何時使用handler.post()時,新的Thread()

它在開發者文檔中提到的處理程序:

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

這是否意味着,如果我寫onCreate()Activity的類:

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

然後將可運行在一個單獨的線程或活動的線程調用?

回答

64

無論何時想要在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

+0

但如果說我希望緩衝從互聯網上的音頻流。我應該通過handler.post還是通過新線程來完成? – reiley 2013-02-28 13:05:38

+1

真的取決於您的要求。我會考慮新的線程或服務。我會以秒爲單位更新答案。 – kamituel 2013-02-28 13:07:54

11

實施例被擡高:

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(); 

這是一個好後,概述的區別:What exactly does the post method do?

18

回答您的具體問題:

這是否意味着,如果在活動類的OnCreate我寫:

處理程序處理程序=新的處理程序()hanlder.post(可運行);那麼,可運行的 將在單獨的線程中或在Activity的線程中調用?

不,它不會。 Runnable將在主線程上被調用。 處理程序僅用於將消息發佈到它所連接的線程(創建它的地方)。 它不會自行創建線程。 在你的例子中,你在主線程(在Activity.OnCreate()被調用的地方)創建了一個Handler,因此任何發佈在這個Handler上的消息都只會在主線程上運行。

+3

正確的答案並不總是被選爲最佳。謝謝 – 2017-07-25 13:45:36

+0

你只是完全改變了我的應用程序的perfs!從處理程序轉移到線程只是讓我的應用程序飛行!非常感謝的人! – Mitchapp 2017-11-27 15:52:03

2

使用handler.post()當你想代碼(通常是從後臺線程)主線程。是啊,POST,就像你一樣,給別人發信。隨着處理器的幫助下的代碼將盡快即幾乎立即執行。

相關問題