2012-12-24 24 views
11

希望有人能向我解釋這一點或指向我可以閱讀的資源以瞭解更多信息。我建立一個使用ListView控件的應用程序,並且我模仿過很多的教程之一可在網上像這樣一個自定義列表適配器:瞭解何時以及爲什麼要使用不同的Android線程

http://www.softwarepassion.com/android-series-custom-listview-items-and-adapters/

它工作得很好。但是,如何執行此操作的每個示例都將運行構建要顯示的對象列表並在單獨的線程上收集所需數據的過程。

我想知道爲什麼/你不能把所有東西都放到onCreate中嗎?我看不出爲什麼你需要單獨的線程來實現這個目的。是否有一些通用的表格/標準,用於在特定線程上運行何時/必須運行什麼?

回答

7

The Android docs對此非常好,與大多數事情一樣。

結果是:UI應該始終是響應式的。所以if you have some operation that will take enough time that the user will notice, you might want to consider not running it in the UI thread。一些常見示例是network IOdatabase accesses。儘管如此,這是個案例,所以你必須爲自己打電話。

+0

好,所以想法是將任務可能需要更多時間委派給其他線程,以便主線程不會等待信息從其他地方可以運行別的東西。所以,儘管你可以運行onCreate中的所有東西,但它可能不是最有效的方法。 – Rarw

+0

那麼這取決於你如何定義「高效」。最佳實踐通常表明,如果您的某些內容需要「明顯」的時間,那麼您應該將其移出UI線程,因此不會使用onCreate。這也取決於你是否需要結果來顯示UI等。但是,是的,你的評論是正確的,我會說。 – mfrankli

2

那麼,如果構建對象列表不是一個相對較短的過程,那麼在onCreate()中執行就會阻塞/減慢主線程。如果您使用單獨的線程,它將允許Android操作系統加載所有UI元素,而您正在等待列表填充。然後,當對象列表準備就緒時,您可以立即填充已經初始化的UI,而不是等待在構建對象列表之後等待初始化UI。它確保您的應用程序始終對用戶作出響應。

0

因爲您只有0.5秒的時間來執行onCreate - 之後會顯示可怕的ADN(應用程序未響應)錯誤消息。所以除非你的列表視圖非常簡單,否則你不能及時完成。即使你的列表視圖非常簡單,最好以正確的方式學習它。

順便說一句:我甚至不使用線程,我使用一個或多個服務來完成所有的工作。實施起來更加困難,但也更加健壯和反應靈敏。

0

你不在onCreate或UI線程中做事情的原因是爲了響應。如果您的應用需要很長時間才能處理,用戶會看到一個App Not Responding對話框。

0

我老師曾經說過:每個軟件都可以寫成一個單一的(大)for循環。

如果您認爲:可以......也許在NDK級別。

一些SDK開發人員想讓軟件開發人員的任務更容易,那就是爲什麼存在SDK和框架。

除非您不需要多任務,否則您應該使用單線程。

有時候會有時間限制,有時是UI /背景/網絡限制,需要在差異線程中做東西。

0

如果你看到Asyntask和Handler的源代碼,你將會看到他們的代碼純粹用Java。 (當然,有一些例外,但這不是重點)。

這是什麼意思?這意味着在Asyntask或Handler中沒有魔法。作爲開發人員,他們只是讓你的工作更輕鬆。

例如:如果ProgramA調用了methodA(),了methodA()將在不同的線程與ProgramA.You可以很容易地通過試運行:

Thread t = Thread.currentThread();
int id = t.getId();

,以及爲何要使用新的線程?你可以谷歌的。許多原因。

那麼,有什麼區別?

AsyncTask和Handler是用Java編寫的(內部使用一個線程),所以您可以使用Handler或AsyncTask執行所有操作,您也可以使用線程來實現。

Handler和AsyncTask真的可以幫助您嗎?

最明顯的原因是調用者線程和工作線程之間的通信。 (調用者線程:調用Worker線程來執行某個任務的線程。調用者線程可能不總是UI線程)。當然,您可以通過其他方式在兩個線程之間進行通信,但存在很多缺點,例如:主線程不是線程安全的(大多數情況下),換句話說,是危險的。

這就是爲什麼你應該使用Handler和AsyncTask。他們爲你做了大部分工作,你只需要知道要覆蓋哪些方法。

差異處理程序和AsyncTask:當調用者線程是UI線程時使用AsyncTask。這是Android的文件說什麼:

AsyncTask enables proper and easy use of the UI thread. This class allows to perform background operations and publish results on the UI thread without having to manipulate threads and/or handlers

我想強調兩點:

1)易於使用的用戶界面線程的(所以,當使用調用程序線程是UI線程)。

2)不需要操縱處理程序。 (意思是:你可以使用Handler而不是AsyncTask,但AsyncTask是一個更簡單的選項)。

在這篇文章中有很多東西,我還沒有說,例如:什麼是UI線程,爲什麼它更容易。你必須知道每一種背後的一些方法和使用它,你就會徹底明白爲什麼..

@:當你讀的Android文件,你會看到:

Handler allows you to send and process Message and Runnable objects associated with a thread's MessageQueue

它們可能看起來很奇怪,在第一。只要理解,每個線程都有每個消息隊列。 (就像一個待辦事項列表),線程會把每條消息做到消息隊列實例。 (啊,也許就像你完成你的工作,去睡覺)。所以,當Handler通信時,它只是給調用者線程發送消息,並等待處理。 (sophiscate?但你只知道,Handler可以以安全方式與呼叫者線程進行通信)

相關問題