簡體   English   中英

Android:如何在Activity被銷毀時保留AsyncTask實例?

[英]Android: How to retain AsyncTask instance when Activity gets destroyed?

在我的應用程序中,我有一個繼承自AsyncTask的類,該類從服務器下載大量數據。 我正在使用一個ProgressBar來指示下載進度。

當用戶按下HOME鍵時,此AsyncTask附加到的Activity被銷毀,但下載繼續。

如何重新附加此AsyncTask並向用戶顯示進度? 我嘗試使用onRetainNonConfigurationInstance但Android 4.0似乎未調用此方法。 我的應用程序未使用Fragments API。

在這種情況下,我所做的事情如下:

  1. 我創建了一個IntentService來處理與服務器的通信。 這具有AsyncTask的某些優點(例如,工作線程),但還具有Service的某些優點(可隨時隨地使用)。
  2. IntentService可以通過我的主Activity中的用戶操作來調用,也可以通過不精確的重復警報來調用。
  3. 數據存儲在SQLite數據庫中 ,由ContentProvider開頭 我通過使用SQLiteOpenHelper並從后台IntentService的安全性調用getWritableDatabase()來避免何時/如何創建數據庫和表的問題。
  4. 任務完成后,如果我的主活動未處於活動狀態,它將發布通知

關於這種安排的一件好事是,不需要進度條。 實際上,不需要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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM