9

我知道這是被問了很多次的問題。然而,我從來沒有找到答案。所以希望有人能給我一些啓示。Android AsyncTask vs Thread + Handler vs rxjava

我們都知道AsyncTask和Thread是執行後臺任務以避免ANR問題的選項。建議asynctask只能用於短時間運行的任務,而線程可用於長時間運行的任務。 asynctask不應該用於長時間任務的原因衆所周知,這是由於asynctask可能導致的泄漏,因爲它可能會在某個活動被破壞後繼續運行。這是令人信服的。但是,它也會導致一些其他問題:

  1. 線程是否也獨立於活動生命週期?因此,asynctask的風險也可以應用於線程。那麼爲什麼線程適合長時間運行的任務呢?
  2. 看起來asynctask的風險只適用於與活動一起使用。如果我們在服務中使用它(不是IntentService,因爲IntentService在其工作完成後停止),並且只要我們可以保證在服務停止時取消asyntask,我們可以將它用於長時間運行的任務嗎?這是不是意味着在服務中使用asynctask是無風險的?
  3. 我玩過rxjava一段時間,真的很喜歡它。它消除了對線程操作的擔心(除非你必須決定在哪個線程中訂閱和觀察發送的數據)。從我所看到的,rxjava(與其他一些libs一起,如retrofits)似乎是asynctask和thread的完美替代品。我想知道我們是否可以完全忘記它們,或者有任何特定情況下rxjava無法實現asynctask和thread可以做的事情,我應該知道的是什麼?

感謝

回答

1

由於沒有人的回覆。那麼我正在回答我自己的問題。

  1. 爲什麼AsyncTask建議只是短期的任務(約5秒),原因是沒有方法來取消正在運行的AsyncTask。存在調用onCancelled(Result result)的稱爲AsyncTask.cancel(true)的方法。但是,根據文檔,此方法「在調用cancel(boolean)並且doInBackground(Object [])完成後在UI線程上運行。」 (https://developer.android.com/reference/android/os/AsyncTask.html)。另一方面,Thread可以用Thread.interrupt()停止。
  2. Service內運行AsyncTask應該沒有任何問題,前提是您知道AsyncTask的取消限制,並且可以由AsyncTask創建內存泄漏的可能性。請注意,在工作線程中已經運行的IntentService中顯然不需要使用AsyncTask
  3. 這是一個非常基於經驗的問題。我想這不會有完整的答案。我們所能做的就是了解Rx並意識到它的侷限性,以確定何處適合使用它。在我的開發工作中,我始終使用RxJava而沒有任何問題。請注意,相同的內存泄漏問題也適用於RxJava。您也許可以找到其中一個具體問題here。還有一大堆關於處理泄漏/屏幕旋轉的討論,RxJava可以通過Google搜索輕鬆找到。
0

的AsyncTask和線程+處理器沒有精心設計和實施。 RxJava,Akka和其他用於異步執行的框架似乎更加精心開發。

每種技術都有其侷限性。 AsyncTask適用於具有在UI上顯示進度的單個並行任務。但是,如果活動重新生成(例如由於屏幕旋轉),則與用戶界面的連接丟失(此問題的一種可能解決方案是https://github.com/rfqu/AsyncConnector)。

Thread+Handler即使在沒有要處理的消息時也爲線程堆棧保留內存。這限制了可能的線程數量。您可以擁有比處理程序線程多得多的Akka actorsRxJava Subscribers,具有類似的功能。

+0

感謝您的回答。那麼它意味着總是使用rxjava而不是Asynctask和Thread?你能否在答案中「仔細」澄清你的意思?謝謝 –