2012-08-04 201 views
0

有幾種方法可以在應用程序中異步獲取數據。一個是Handler,另一個是AsyncTask。現在我已經使用了兩種方法,並且希望知道哪些方法在某些任務中執行得更好/效率更高。Handler(MessageQueue)和AsyncTask(SERIAL_EXECUTOR)有什麼區別,性能明智嗎?

Thusfar,我大部分時間在得到的Webdata在獲取數據從ServicesActivities使用AsyncTasksHandler的。

我想知道是否有優勢使用Handler的Webdata,或使用AsyncTasks刷新從Services UI。什麼是最大的區別?

回答

4

由於AsyncTask uses a Handler,您的比較是...奇怪。

AsyncTask適用於事務性工作:需要超過幾毫秒且少於幾分鐘的工作量。對於這類工作,如果您不需要自己的線程管理,AsyncTask通常更易於使用。

如果您有一些特定的特徵,那麼AsyncTask不容易處理線程,或者如果您需要線程的時間不確定(例如,直到用戶按下「停止」按鈕),請使用您自己的線程線程和其他東西以獲得主應用程序線程的工作:a Handlerpost()runOnUiThread()。 「不確定的一段時間」建議假定您正在使用其中一個內置線程池 - 我從來不會將線程綁定到您未設置的線程池之外。

1

看起來像AsyncTask使用它自己的內部處理程序。我的測試是使用Handler的「帖子」立即排隊。當在onCreate中使用時,這可能會有問題,因爲其他操作必須在onCreate之後入列(尚未通過Android Activity等源讀取)。所以,試圖發佈到後來加載佈局不起作用。必須使用AsyncTask。由於AsyncTask有其自己的內部處理程序;也許,那麼在onCreate之後直接在隊列中創建任務可能會發生,但doInBackgroundonPostExecute可能稍後會發生,因爲它們稍後會在隊列中。

所以,AsyncTask工作了此UI更需要與setContentView後加載過大的佈局文件 - 後來的意義因此ProgressDialog可以顯示的onCreate後。在完成onCreate之前,ProgressDialog纔會顯示。

此外,請參閱此文章以瞭解如何使用choose when to use AsyncTask。基本上說,當想要更新用戶界面。但實際上你可以用runOnUIThread來做到這一點,所以如果你已經知道Java線程,那麼不需要處理程序,也不需要AsyncTaskrunOnUIThread就像Swing中的invoke/invokeLater東西。

相關問題