早期版本的中国大学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了!这样就可以实现,就算应用被关闭了一样可以继续下载。