中国大学MOOC中的后台文件传输

早期版本的中国大学MOOC一旦被挂起后,应用在完成当前下载任务后无法继续添加新任务,当然也无法将缓存状态写入数据库。这个问题能否顺利解决直接关系到用户体验。

那么如何解决呢?

大致的思路是,在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中添加这个后台任务的声明 alt 接下来在创建后台传输任务的时候设置触发器,任务完成后就会触发刚才创建的那个后台任务


        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秒的时间所以我们可以主动等待1-2秒,然后检查一下数据库中对应任务是否已经被标记,如果应用正在运行那么任务完后会立刻更新数据库中任务的状态,如果没有则说明应用已被关闭,此时只需更新数据库,并检查是否有后续任务,如果有继续创建一个新任务即可。这样就可以实现在应用被关闭后仍然继续任务队列中的任务。其实相当于通过数据库来完成了进程间的通信。

ZhuiMeng

The dark night gave me black eyes I use them to look for light

Subscribe to ZhuiMeng's Corner

Get the latest posts delivered right to your inbox.

or subscribe via RSS with Feedly!