wp7后台文件传输之-----BackgroundTransferService(二)
之前在wp7后臺文件傳輸之-----BackgroundTransferService(一)中講述了WP7后臺傳輸?shù)姆N種限制,本來計劃是要做一個后臺上傳的,但是想到上傳還需要寫服務(wù)端,作為一個懶人,太麻煩,還是寫一個下載好了.
后臺傳輸?shù)牧鞒檀蟾攀沁@樣的:
1.New一個BackgroundTransferRequest對象,設(shè)置URL地址,同時配置一堆HTTP頭參數(shù)
2.設(shè)置下載到本地的地址.注意:下載的地址必須在獨立存儲中的shared/transfers/目錄下.
3.把這個BackgroundTransferRequest Add到BackgroundTransferService中,然后就OK了.
為了監(jiān)控下載的狀態(tài),還需要寫一個頁面,列出當(dāng)前正在執(zhí)行的任務(wù),同時提供取消,暫停等方法.注:這也是包含后臺下載功能的APP 提交到市場必須要做的內(nèi)容.
創(chuàng)建下載任務(wù)的代碼:
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);
//創(chuàng)建Request對象
BackgroundTransferRequest transferRequest = new BackgroundTransferRequest(transferUri);
//設(shè)置一些請求的屬性
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;//這里需要根據(jù)情況進(jìn)行設(shè)置,詳細(xì)內(nèi)容參見這里http://msdn.microsoft.com/zh-cn/library/microsoft.phone.backgroundtransfer.transferpreferences(v=vs.92).aspx
//添加到下載列表中.這里要注意的是,每一個應(yīng)用同時只能有5個請求在下載列表中
BackgroundTransferService.Add(transferRequest);
到這里,任務(wù)添加代碼就寫好了.
接下來看看任務(wù)監(jiān)控的代碼.
任務(wù)監(jiān)控主要是監(jiān)控任務(wù)列表中,任務(wù)的TransferStatusChanged和TransferProgressChanged事件,前者是任務(wù)狀態(tài)變更的時候會觸發(fā),后者是任務(wù)進(jìn)度改變的時候會觸發(fā).
下面是代碼:
IEnumerable<BackgroundTransferRequest> transferRequests;
//然后寫一個方法來刷新UI,這個刷新方式挺奇特.- -!
private void UpdateRequestsList()
{
//如果list不為空,那么首先將他釋放掉.不然會內(nèi)存溢出
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);
}
//在每次事件觸發(fā)的時候,去做相應(yīng)操作
void transfer_TransferStatusChanged(object sender, BackgroundTransferEventArgs e)
{
ProcessTransfer(e.Request);
UpdateUI();
}
void transfer_TransferProgressChanged(object sender, BackgroundTransferEventArgs e)
{
UpdateUI();
}
//這個方法就是用來統(tǒng)一處理每一個請求需要做的操作
private void ProcessTransfer(BackgroundTransferRequest transfer)
{
switch (transfer.TransferStatus)
{
case TransferStatus.Completed:
//一般來說,服務(wù)器返回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;
}
}
寫了這么多,大致的內(nèi)容就是,如果下載完成了,就把文件轉(zhuǎn)移,并且從下載列表中移除,這里需要注意的是,下載請求必須由開發(fā)者手工移除,不然他會一直都在那里.
如果下載進(jìn)度有變更,那么就刷進(jìn)度條的UI.
應(yīng)該說,整個BackgroundTransferService的使用還是非常便捷的,麻煩的是UI的處理,但是這也是提交到商店必須做的.所以沒辦法.
到這里一個可以后臺下載文件的APP,就差不多做好了.當(dāng)然,還有刪除請求什么的,蠻簡單,這里沒寫出來.附件的工程里面有的.
PS.以上代碼不是完整代碼,完整代碼到附件中去下載.
本文章同步發(fā)表在WPDevN:?http://www.wpdevn.com/showtopic-51.aspx
轉(zhuǎn)載于:https://www.cnblogs.com/spidernet/archive/2012/03/05/2381120.html
總結(jié)
以上是生活随笔為你收集整理的wp7后台文件传输之-----BackgroundTransferService(二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 雷军宣布小米参加 MWC 2023 大会
- 下一篇: 如何使用你手中的利器