2013-01-23 71 views
-2

我在一個非常煩人的問題面前。 我有一個可能需要幾十秒才能執行的代碼。最後,我需要獲得該計算的結果。如何放棄Android線程?

如果我僅僅在主線程上執行代碼,Android會彈出告訴線程被阻塞並詢問是否要強制阻塞。

那麼原理是正常的,每個操作系統的內核需要知道我們的代碼還活着並且沒有被阻塞。

所以我的問題是如何通知Android我們沒死?例如相當於一個Sleep(0)或ProcessMessage()或任何東西...但是這告訴Android我們並沒有死,因爲我們只是在等待或執行相當長的事情...

請不要請回答我:「讓你的計算在一個單獨的線程中」,因爲問題將完全相同。主線程仍然需要坐下來了解線程何時完成及其結果。

+2

問題不會完全一樣。當另一個線程正在計算時,原始線程可以繼續運行用戶界面。它會把問題從一個困難的問題(我怎麼一次做兩件事)轉變爲一個簡單的問題(我如何繼續做同樣的事情,我已經在做)。 –

回答

6

您不應該運行任何訪問數據庫,互聯網的進程,或者在UI線程上花費更長的時間和0.2秒。

Asynctask是一個非常強大的方法,它允許你進行線程計算,同時仍然能夠在預定點更新UI。學會喜歡它。

只要讓用戶知道,請在預執行塊上出現一個請等待微調對話框,並使其在執行後塊上消失。

編輯:深入瞭解這一點:asynctask有三個塊,它們在預執行,onPostExecute和onProgressUpdate的UI線程上運行。在這些塊中,您可以更新UI。在doInBackground塊中,它是它自己的線程,因此在處理時不會阻塞UI。

實際上,您可以設置通知onPreExecute中發生進程,在onProgressUpdate期間通知用戶進度,然後在onPostExecute塊中顯示最終信息/清除任何請等待對話框。它是專門設計來解決你正在討論的確切問題。

通過在UI線程上運行將系統鎖定超過4秒的任何進程都會導致向用戶呈現不響應的錯誤。

http://developer.android.com/reference/android/os/AsyncTask.html

+3

如下所述,我可能會抓住這一點,但AsyncTask被用作*方式*更多的主力比它應該。人們在AsyncTasks中做的許多事情 - 尤其是網絡活動 - 在IntentService中會更好地完成。 ...和,順便說一句,後蜂窩,你不能從UI線程觸及網絡。 –

1

我可能會抓住這一點但實際上只在適當的地方使用AsyncTask! (閱讀:戒菸吧!)

維吉爾Dobjanschi的答案在這裏:

http://www.youtube.com/watch?v=xHXn3Kg2IQE

..是真的,真的很好。這有點複雜,但通常不會比實際問題複雜。

儘管原始問題中沒有很多細節,但解決問題的最佳方法可能是(因爲所有答案都一致)使用單獨的線程。但是,到達另一個線程的最好方式可能是IntentService的意圖。 ...然後runOnUiThread或Handler來獲取響應。

+0

謹慎地給他一分鐘他說的話?我不願意花一個小時才能看到「使用AsyncTask退出」的環境。 – WarrenFaith

+0

ASyncTask是執行異步任務的推薦方式(請觀看其他Google I/O演示文稿以從Android開發人員自己那裏聽到它 - 而不是應用程序團隊) – Merlin

+1

我認爲這將是麻煩。 AsyncTask是執行非常簡單的異步任務的推薦方式。它不是管理應用中所有併發的唯一方式,也不是最好的方式。是的,「停止使用它」肯定是過度的。不過,考慮替代方案。特別是我提到的那個。 –