2012-04-04 53 views
1

來自基本的Java世界,我知道有一種方法可以通過創建一個新的Runnable並將其傳遞給一個新的Thread並調用它開始來產生一個線程。例如:什麼是產生新線程的android優選方式?

Runnable r = new Runnable() { 
    @Override 
    public void run(){ 
    } 
} 

new Thread(r).start() 

現在加入Android世界,似乎Android生態系統提供了其他一些方法來產生線程。其中之一是Activity.runOnUiThread(用於在UI上完成的任務)和Handler.post(可運行)。

我在想什麼是Android產生新線程的首選方式。我看到很多案例,例如:

Handler handler = new Handler() 
handler.post(r) 

是否有一個很好的理由使用Handler來生成一個線程,而不是創建一個新線程舊的方式?

謝謝。 Yev

回答

2

查看AysncTask framework。 Google似乎希望你處理線程......儘管你可以使用標準的Java線程。

+1

完全正確管理線程和處理程序爲您服務。這裏有一個很好的教程,討論Android「線程」,「異步任務」和「處理程序」:http://www.vogella.de/articles/AndroidPerformance/article.html – paulsm4 2012-04-04 18:54:35

+0

謝謝......這解釋了我的一些擔憂。 – ymotov 2012-04-06 14:18:04

0

Handler不應該產生線程,而是要post新的任務到UI線程。國際海事組織的方式產卵線程是java的方式,通過直接運行或擴展線程。 Android人圍繞着Async任務包裝了一個Executor,並公開了直接在UI線程中運行的一些方法,以及一個在後臺運行任務的方法。

1

處理程序按照您演示的方式實際上不會生成新線程。處理程序不是線程,而是IPC的一種手段,讓一個線程告訴另一個線程運行代碼。您仍然以舊的方式產生線程,但處理程序可以幫助這些線程更好地交流。

說,例如,你有你通常的方式在後臺催生掀起了主題:

Runnable r = new Runnable() { 
    @Override 
    public void run(){ 
    } 
} 

new Thread(r).start() 

它運行在後臺做處理,但它需要與更新UI它的進步,所以它回調到活動:

onProgress(int progress) { 
    // update UI 
} 

如果您運行的代碼,它會拋出一個異常,因爲只有UI線程被允許更新UI。處理程序可以像這樣解決這個問題:

public void onProgress(int results){ mHandler.post(new UIUpdater(results)); }

private class UIUpdater implements Runnable { 
    UIUpdater(int results) { 
    //construct whatever... 
    } 

    @Override 
    public void run() { 
    //Update UI 
    } 
} 

或者,你可以擁有的Android通過AsyncTask框架

+0

謝謝JRaymond ...我認爲AsyncTask是我一直在尋找的東西。 – ymotov 2012-04-06 14:18:31

相關問題