wp7后台文件传输之-----BackgroundTransferService(二)

之前在wp7后台文件传输之-----BackgroundTransferService(一)中讲述了WP7后台传输的种种限制,本来计划是要做一个后台上传的,但是想到上传还需要写服务端,作为一个懒人,太麻烦,还是写一个下载好了.
后台传输的流程大概是这样的:
1.New一个BackgroundTransferRequest对象,设置URL地址,同时配置一堆HTTP头参数
2.设置下载到本地的地址.注意:下载的地址必须在独立存储中的shared/transfers/目录下.
3.把这个BackgroundTransferRequest Add到BackgroundTransferService中,然后就OK了.
为了监控下载的状态,还需要写一个页面,列出当前正在执行的任务,同时提供取消,暂停等方法.注:这也是包含后台下载功能的APP 提交到市场必须要做的内容.
创建下载任务的代码:

//首先判断下载存储区是否存在,不存在则创建一个
using (IsolatedStorageFile isoStore = IsolatedStorageFile.GetUserStoreForApplication())
{
if (!isoStore.DirectoryExists("/shared/transfers"))
{
isoStore.CreateDirectory("/shared/transfers");
}
}
//指定需要下载的文件的URL
string downloadurl="http://create.msdn.com/assets/cms/images/samples/windowsphonetestfile1.png";
Uri transferUri = new Uri(Uri.EscapeUriString(downloadurl), UriKind.RelativeOrAbsolute);
//创建Request对象
BackgroundTransferRequest transferRequest = new BackgroundTransferRequest(transferUri);
//设置一些请求的属性
transferRequest.Method = "GET";
string downloadFile = "windowsphonetestfile1.png";
Uri downloadUri = new Uri("shared/transfers/" + downloadFile, UriKind.RelativeOrAbsolute);
transferRequest.DownloadLocation = downloadUri;
transferRequest.Tag = downloadFile;
transferRequest.TransferPreferences = TransferPreferences.AllowCellularAndBattery;//这里需要根据情况进行设置,详细内容参见这里http://msdn.microsoft.com/zh-cn/library/microsoft.phone.backgroundtransfer.transferpreferences(v=vs.92).aspx
//添加到下载列表中.这里要注意的是,每一个应用同时只能有5个请求在下载列表中
BackgroundTransferService.Add(transferRequest);

到这里,任务添加代码就写好了.
接下来看看任务监控的代码.
任务监控主要是监控任务列表中,任务的TransferStatusChanged和TransferProgressChanged事件,前者是任务状态变更的时候会触发,后者是任务进度改变的时候会触发.
下面是代码:

//首先声明一个List来存放下载的列表
IEnumerable<BackgroundTransferRequest> transferRequests;
//然后写一个方法来刷新UI,这个刷新方式挺奇特.- -!
private void UpdateRequestsList()
{
//如果list不为空,那么首先将他释放掉.不然会内存溢出
if (transferRequests != null)
{
foreach (var request in transferRequests)
{
request.Dispose();
}
}
//然后把BackgroundTransferService里面的Request放到这个List里
transferRequests = BackgroundTransferService.Requests;
}

//接下来,为每一个请求绑定两个事件
foreach (var transfer in transferRequests)
{
transfer.TransferStatusChanged += new EventHandler<BackgroundTransferEventArgs>(transfer_TransferStatusChanged);
transfer.TransferProgressChanged += new EventHandler<BackgroundTransferEventArgs>(transfer_TransferProgressChanged);
}

//在每次事件触发的时候,去做相应操作
void transfer_TransferStatusChanged(object sender, BackgroundTransferEventArgs e)
{
ProcessTransfer(e.Request);
UpdateUI();
}

void transfer_TransferProgressChanged(object sender, BackgroundTransferEventArgs e)
{
UpdateUI();
}

//这个方法就是用来统一处理每一个请求需要做的操作
private void ProcessTransfer(BackgroundTransferRequest transfer)
{
switch (transfer.TransferStatus)
{
case TransferStatus.Completed:

//一般来说,服务器返回200或者206就表示传输成功完成,我们可以文件移到另外一个地方
if (transfer.StatusCode == 200 || transfer.StatusCode == 206)
{
RemoveTransferRequest(transfer.RequestId);

using (IsolatedStorageFile isoStore = IsolatedStorageFile.GetUserStoreForApplication())
{
string filename = transfer.Tag;
if (isoStore.FileExists(filename))
{
isoStore.DeleteFile(filename);
}
isoStore.MoveFile(transfer.DownloadLocation.OriginalString, filename);
}
}
else
{
RemoveTransferRequest(transfer.RequestId);

if (transfer.TransferError != null)
{
// Handle TransferError if one exists.
}
}
break;
}
}

写了这么多,大致的内容就是,如果下载完成了,就把文件转移,并且从下载列表中移除,这里需要注意的是,下载请求必须由开发者手工移除,不然他会一直都在那里.
如果下载进度有变更,那么就刷进度条的UI.
应该说,整个BackgroundTransferService的使用还是非常便捷的,麻烦的是UI的处理,但是这也是提交到商店必须做的.所以没办法.
到这里一个可以后台下载文件的APP,就差不多做好了.当然,还有删除请求什么的,蛮简单,这里没写出来.附件的工程里面有的.

PS.以上代码不是完整代码,完整代码到附件中去下载.


本文章同步发表在WPDevN: http://www.wpdevn.com/showtopic-51.aspx

posted @ 2012-03-05 22:57  xpsnets  阅读(1477)  评论(0编辑  收藏  举报