適用於長時間運行的Android AsyncTask


Answers

為什麼?

因為默認情況下, AsyncTask使用了一個你沒有創建的線程池。 永遠不要捆綁你沒有創建的池中的資源,因為你不知道池的要求是什麼。 如果該池的文檔告訴你不要這樣做,那麼不要將池中的資源捆綁在一起,因為這種情況就是這樣。

特別是,從Android 3.2開始,默認情況下AsyncTask使用的線程池(對於android:targetSdkVersion設置為13或更高的應用程序)只有一個線程 - 如果無限期地綁定此線程,則不會執行其他任務會跑。

Question

它說,引用在here找到的AsyncTask的文檔

理想情況下,AsyncTasks應該用於短操作(最多幾秒)。如果您需要保持線程長時間運行,強烈建議您使用java.util.concurrent pacakge提供的各種API,例如執行器,ThreadPoolExecutor和FutureTask。

現在我的問題出現了,為什麼? doInBackground函數運行在UI線程之外。 那麼在這裡進行長時間的手術會有什麼危害?




AsyncTask的問題在於,如果它被定義為活動的非靜態內部類,它將具有對活動的引用。 在異步任務容器完成的活動中,但AsyncTask中的後台工作繼續的情況下,活動對像不會被垃圾回收,因為存在對其的引用,這會導致內存洩漏。

解決這個問題的方法是將異步任務定義為靜態內部活動 ,並對上下文使用較弱的引用。

但是,將它用於簡單和快速的後台任務是一個不錯的主意。 要使用乾淨的代碼開發應用程序,最好使用RxJava來運行複雜的後台任務並使用其結果更新UI。




Links