2014-01-15 46 views
1

我的問題是一個簡單的問題,我正在尋找建議或指向Android中多線程和聯網有用教程的鏈接。我看過的每個例子都使用AsyncTask。我想知道的是,你可以只使用線程和處理程序來獲取和使用數據嗎?在Android中使用AsyncTask執行網絡操作

我知道HTTP請求必須在新線程上完成,否則你會得到NetworkOnMainThreadException,但我想使用線程和處理程序的原因是因爲我想用其他線程中的數據更新UI 。

我不是真的在代碼之後,只是指向正確的方向。

+4

是的,你可以但你爲什麼要重新發明輪子?在'AsyncTask'文件中找到'publishProgress()'''onProgress()','onPostExecute()'做 – zapl

+0

或者,你也可以看看這個鏈接https://developer.android.com/training/multiple- threads/index.html –

+1

AsyncTask只是一個管理後臺線程的事件處理程序,用於回發到UI線程。但是創建一個線程,然後使用在UI線程上創建的Handler進行回發,在概念上並沒有什麼不同。所以你的問題的答案是可以的。 – NigelK

回答

0

認爲Threads與常規代碼相同,區別在於它們在後臺運行。所以你必須問自己的問題是:如果我沒有運行Thread s,我可以使用Handlers嗎?答案是肯定的,你只需要通過參與ActivitiesThreads之間的Handler對象等

現在,如果你想了解該選什麼建議。請記住,AsyncTask實際上是一個「改進」的線程,但與流行的觀點相反,它不適用於長時間運行的流程。例如,如果你想讓一個線程運行所有的應用程序,這不是正確的選擇。它旨在用於有結束的任務。

如果要運行長時間任務,請使用Service。開始時有點混亂,但這是正確的選舉。但要小心,一個Service不是一個線程!但是,您可能會將線程放入其中,並將它們視爲在其他地方運行。

1

我想知道的是,你能得到和使用線程和處理程序的數據嗎?

是的。網絡操作只需要在後臺Thread上完成,無論是使用doInBackground()AsyncTask還是創建新的Thread。看看Painless ThreadingProcesses and Threads

我想用另一個線程的數據更新UI。

無論你使用什麼,你仍然需要更新主要Thread上的UI。除了doInBackground()onPreExecute(),onProgressUpdate()onPostExecute()全部在主要Thread上運行)之外,使用AsyncTask的任何其他方法可以非常容易地完成此操作。在Android的

AsyncTask Docs

1

網絡操作可以在以下任一方式進行。

  1. 異步任務
  2. 意向服務
  3. WakefulBroadcastReceiverCommonsWare's WakefulIntentService

當我應該使用每個這個選項?

  1. 工作應在約1秒或更短的時間來完成 - 異步任務
  2. 工作可能需要1秒以上,但小於10秒 - IntentService
  3. 工作可能需要超過15秒 - WakefulBroadcastReceiver
+0

我不確定我會將'AsyncTask'限制爲1秒或更少...... – codeMagic