[英]Android: How to retain AsyncTask instance when Activity gets destroyed?
在我的應用程序中,我有一個繼承自AsyncTask
的類,該類從服務器下載大量數據。 我正在使用一個ProgressBar
來指示下載進度。
當用戶按下HOME
鍵時,此AsyncTask
附加到的Activity
被銷毀,但下載繼續。
如何重新附加此AsyncTask
並向用戶顯示進度? 我嘗試使用onRetainNonConfigurationInstance
但Android 4.0似乎未調用此方法。 我的應用程序未使用Fragments
API。
在這種情況下,我所做的事情如下:
關於這種安排的一件好事是,不需要進度條。 實際上,不需要UI。 用戶在服務運行時繼續使用該應用程序,並且當新數據進入ContentProvider時,UI會自動刷新。 它的另一個不錯的方面是,與AsyncTask相比,編寫代碼更少。 通過從數據庫中讀取最后一個條目的服務器端元數據,並要求用戶在此之后開始,它會自動選擇上次中斷的位置。 由於它不受任何Activity實例的束縛,因此它不關心onPostExecute()或配置更改或任何其他更改 。 而且您不必擔心像AsyncTask這樣的單次執行。
如果需要在后台下載大量數據,我會使用服務而不是AsyncTask。 Google IO很好地介紹了如何使用服務。
引用AsyncTask文檔:
如果需要讓線程長時間運行,強烈建議您使用java.util.concurrent包提供的各種API,例如Executor,ThreadPoolExecutor和FutureTask。
和
該任務只能執行一次(如果嘗試第二次執行,則會引發異常。)
據我了解,您不能繼續執行上一個AsyncTask。 不過,您可以部分加載數據並保存讀取的數據量,然后啟動新的AsyncTask,該任務將從上次保存的點開始。 從我的角度來看,這不是在活動進入后台時暫停加載的最佳主意,最好使用服務來完成已開始的工作。
您是否考慮過使用服務將AsyncTask附加到? 視為永久運行的服務可能是您手頭任務的最佳解決方案。 然后,您要做的就是檢查服務是否正在運行,以及下載是否正在運行(使用靜態布爾變量輕松完成),然后您就可以使用服務中的某些狀態保存變量(可能是一個百分比)來創建進度對話框主要活動的onCreate方法中下載的總文件大小等)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.