2011-09-05 42 views
2

在Android中開發一個應用程序,它接收實時數據(通過BT),並需要處理它並將其顯示在圖形中。 處理部分很重,所以我想在後臺執行。 我一直在閱讀有關我的可能選項:背景線程上的沉重計算

帶有單獨線程的新服務 - >我不需要有不同的生命週期(處理將在應用程序關閉後立即完成)。

在一個新的線程可運行 - 如前>同樣的問題,我可以 - >我只能調用啓動方法一次(我將需要運行的處理,每4秒左右..)

的AsyncTask只調用一次「執行」。

我最好的選擇是什麼? 每次我想要處理數據(每3或4秒...)時,是否可以創建新的AsyncTask(或者新的Theread)(在內存和性能方面)?

謝謝

+0

實質上,您需要將通信通道導入AsynchTask。你可以使用幾乎所有的數據結構。例如,在您的活動中創建一個Queue對象,並將其作爲參數傳遞給您的AsynchTask。在那裏,存儲它 - 並定期從它讀取數據,如果它可用。在活動中,只需將新數據放入此隊列中即可。 –

+0

謝謝!我假設我應該讓Queue對象同步化,所以我不會同時讀取和寫入風險。 – Alex

+0

是的,自然:) –

回答

2

AsyncTask使用線程池。所以如果你第二次執行新的AsyncTask,就會使用舊的線程。所以你不必擔心開始新線程。

您可以使用IntentService。 IntentService命令從一個工作線程入隊並執行。結果在一次只有一個命令被執行。

+0

的優勢感謝您使用線程池的AsynkTask中的提示。我運行單個服務/工作線程的問題是它涉及@Vineet建議的無限循環,並且我喜歡避免無限循環。如果我每次獲取新的AsyncTask時都會收到要處理的數據,那麼我將冒着讓線程處理舊數據的風險。我不確定我瞭解IntentService是如何工作的(我需要進一步閱讀),但也許這正是我需要的。 – Alex

0

你應該在服務中使用線程有無限循環,當你的應用程序退出,可以保持一個布爾值,這將有助於你停止服務,並從線程釋放資源..

不要忘了從服務中釋放資源,因爲android不會爲你做這件事......

+0

感謝您的回答。但我似乎並沒有理解使用服務(通過一個簡單的新線程或asyncTask)這個 – Alex

0

如果不知道整個數據生命週期就很難更準確,但我會說是的,它是完全可行的每3或4秒運行一次新的Thread

要重新設計您的Thread,它允許調用者每隔3或4秒用一串新數據提供它可能會更好。這種方式這個Thread將保持獨特和可重複使用的應用程序正在運行。

0

最好的選擇是AsyncTask類,因爲所有的應用程序運行在單線程上,即用戶界面線程和你的應用程序包含繁重的處理,用戶不關心處理部分,用戶關心輸出即圖形,所以在幫助你在後臺執行應用程序的處理部分的AsyncTask。而對於時間間隔,你也可以在AsyncTask中應用線程概念。