2013-03-30 66 views
0

我目前正在編寫和android應用程序,並且我正在使用HttpClients和這些類。我花了2個小時試圖修復一些錯誤,直到我看到一篇文章說你不能在主線程中執行該操作。所以他們建議我使用AsyncTask。Android操作和線程

所以我的問題是,我怎麼知道哪些操作應該在不同的線程中完成?有沒有我可以閱讀的清單?

任何信息將是好的,在此先感謝。

回答

2

網絡異常是唯一通過阻止UI線程將在Android中拋出的異常。所以你必須通過在android中編程來記住3條規則。

不要讓UI線程處理需要5秒以上的操作才能完成。

不要讓廣播接收機處理完成onReceive()需要20秒以上的操作。

並且不處理UI線程中的網絡操作。

0

任何需要很長時間的事情都應該在另一個線程中完成。這包括大IO和網絡訪問。不過,我認爲只有網絡訪問會拋出異常,否則會導致無響應的用戶界面。雖然如果你花的時間太長,你會絆倒看門狗定時器,應用程序將被殺死。

0

正如Gabe提到的,你應該在單獨的線程中執行繁重的任務。

關於android線程有兩個重要的事情。

1是共同的線索。(那你問什麼的線程)

2是UI線程...(偵聽用戶inreaction並繪製UI線程)

可以只有通過UI線程才能更改UI(視圖操作)。

另一方面,在蜂窩之後,它被禁止在主線程中執行http請求。 (它被稱爲嚴格模式)

簡而言之,任何阻止用戶交互的操作都應該在另一個線程中完成。

我希望這可以幫助你。

1

至於其他的答案說,Android是不是線程安全,意思是:

  • 不能從後臺線程操作UI
  • 你不能在UI線程上做繁重的任務

這類其他操作可能包括處理大量的數據/數據庫操作/ HTTP請求/網絡管理。真的,我相信任何不需要UI線程但包含大量處理時間的東西都應該移到單獨的線程中。

這是合乎邏輯的,因爲如果您要進行繁重的處理,用戶會感到滯後,並且用戶體驗會受到影響(當然也可能被用於超載系統等)。因此,系統會終止進程並在蜂窩後發出錯誤。

因此,您希望使用異步任務。

一個Async Task真的只是打開一個新的線程,您可以在其中執行重處理或網絡連接。對於網絡連接,我推薦使用AsyncClients like this one以更簡單的格式實現AsyncTask供您使用。還有像UniversalImageLoader這樣的庫,可以讓你將圖像加載到網格/列表中。

我也高度推薦你閱讀official Android documentation discussing this,這裏也有一個有用的post on the Android blog。最後,我感覺好像this post可能對您有用,因爲它可能包含您遇到的錯誤(因爲您在UI線程上執行了操作而導致錯誤)。

其他資源,我發現:

總之,here is an example of an AsyncTask being used.(從@Graham史密斯很好地把答案)。

3

當應用程序嘗試在其主線程上執行聯網操作時,會引發NetworkOnMainThreadException。這隻適用於定位到Honeycomb SDK或更高版本的應用程序。針對早期SDK版本的應用程序允許在其主要事件循環線程上進行聯網,但非常不鼓勵。

是ICS和蜂巢不會讓你在UI線程上執行其他操作的一些例子:

  1. 打開一個Socket連接(即新的Socket())。
  2. HTTP請求(即HTTPClient和HTTPUrlConnection)。
  3. 試圖連接到遠程MySQL數據庫。
  4. 下載文件(即Downloader.downloadFile())。

如果您試圖在UI線程上執行任何這些操作,則必須將它們包裝在工作線程中。最簡單的方法是使用AsyncTask,它允許您在用戶界面上執行異步工作。 AsyncTask將在工作線程中執行阻塞操作,並將結果發佈到UI線程上,而無需您自己處理線程和/或處理程序。