早期版本的中國大學MOOC一旦被掛起后,應用在完成當前下載任務后無法繼續添加新任務,當然也無法將緩存狀態寫入數據庫。這個問題能否順利解決直接關系到用戶體驗。
順便吐槽下,凡是使用了后台文件傳輸還提示你下載過程中不要掛起應用的,應該都是這個問題。
那么如何解決呢?
解決問題的關鍵在於,既然應用被掛起后App是無法執行代碼了,但是我們還有后台任務啊!
大致的思路是,在App被掛起后,我們使用后台任務在文件傳輸完成后根據文件傳輸的狀體來更新數據庫,並且啟動新的文件傳輸任務。
首先我們創建一個后台任務類DownloadTask並實現IBackgroundTask
private BackgroundTaskDeferral _deferral; public void Run(IBackgroundTaskInstance taskInstance) { BackgroundTransferCompletionGroupTriggerDetails details = taskInstance.TriggerDetails as BackgroundTransferCompletionGroupTriggerDetails; if (details == null) { // This task was not triggered by a completion group. return; } _deferral = taskInstance.GetDeferral(); DoTask(details); }
然后在AppxManifest中添加這個后台任務的聲明
接下來在創建后台傳輸任務的時候設置觸發器,任務完成后就會觸發剛才創建的那個后台任務
public static BackgroundDownloader CreateBackgroundDownloader() { BackgroundTransferCompletionGroup completionGroup = new BackgroundTransferCompletionGroup(); BackgroundTaskBuilder builder = new BackgroundTaskBuilder(); builder.TaskEntryPoint = typeof(ChinaMooc.BackgroundTasks.DownloadTask).FullName; builder.SetTrigger(completionGroup.Trigger); BackgroundTaskRegistration taskRegistration = builder.Register(); BackgroundDownloader downloader = new BackgroundDownloader(completionGroup); return downloader; }
接下來的關鍵是判斷應用是否被掛起
有一個簡答粗暴的方法,因為后台任務的運行時間至少有30秒的時間(Windows Phone 8時代)所以我們可以主動等待1-2秒,然后檢查一下數據庫中對應任務是否已經被標記(因為如果應用沒有掛起,文件傳輸完成后一樣會出發后台任務),如果沒有則更新數據庫,並檢查是否有后續任務,如果有繼續創建一個新任務就OK了!這樣就可以實現,就算應用被關閉了一樣可以繼續下載。
這是yunfan.me的備份,以后的博客都會寫在yunfan.me,然后同步到博客園