| Россия, г. Санкт-Петербург |
Лабораторный практикум 4
Лабораторная работа №17. Фоновая загрузка файлов
Задание
Изменить приложение "RSS-новости", добавив поддержку фоновой загрузки RSS-файлов. Добавить для приложения двусторонний тайл.
Освоение
- фоновая загрузка файлов
- тайлы
Описание
Откроем ранее созданный проект "RSS-новости". Добавим два изображения размера 173x173 (для тайлов). Назовем их, например, "RSSred.png" и "RSSblue.png". Установим для данных изображений свойство "Build Action" в "Content".
Примечание: тайлы – это изображения, отображающиеся на главной странице Windows Phone 7. Они могут иметь пояснительные надписи и обратную сторону – другое изображение, которое будет периодически появляться. Для того чтобы добавить тайл приложения на главную страницу, в списке приложений нажмите на ваше приложение и удерживайте. В появившемся контекстном меню выберете "pin to start" Рис. 5.2 :
В код главной страницы добавим функцию установки тайла. Для основной картинки будем задавать RSSred.png, для обратной RSSblue.png.
private void SetTile()
{
ShellTile apptile = ShellTile.ActiveTiles.First();
StandardTileData appTileData = new StandardTileData();
appTileData.Title = "RSS новости";
appTileData.Count = 0;
appTileData.BackgroundImage = new Uri("/RSSred.png", UriKind.RelativeOrAbsolute);
appTileData.BackTitle = "RSS новости";
appTileData.BackContent = "Обратная сторона";
appTileData.BackBackgroundImage = new Uri("/RSSblue.png", UriKind.RelativeOrAbsolute);
apptile.Update(appTileData);
}
SetTile();
Также в коде должна быть добавлена директива:
using Microsoft.Phone.Shell;
Теперь добавим запуск запроса на фоновую загрузку RSS-файла. Для этого в конструктор класса добавим проверку, что в изолированном хранилище приложения присутствует специальная папка, в которую можно загружать файлы, используя фоновые сервисы: "/shared/transfers":
using (IsolatedStorageFile rssStore = IsolatedStorageFile.GetUserStoreForApplication())
{
if (!rssStore.DirectoryExists("/shared/transfers"))
{
rssStore.CreateDirectory("/shared/transfers");
}
}
В код добавим директиву:
using Microsoft.Phone.BackgroundTransfer;
В функции LoadRSS() будем запускать фоновую загрузку нужного файла, а также подписываться на изменение статуса загрузки:
private void LoadRSS(Uri url)
{
BackgroundTransferRequest transferRequest = new BackgroundTransferRequest(url);
transferRequest.Method = "GET";
string strRSSFileName = "";
switch (m_nRssLoadIndex)
{
case 0:
strRSSFileName = strIStoragePolit;
break;
case 1:
strRSSFileName = strIStorageEconom;
break;
case 2:
strRSSFileName = strIStorageSport;
break;
case 3:
strRSSFileName = strIStorageMusic;
break;
case 4:
strRSSFileName = strIStorageMsdn;
break;
default:
MessageBox.Show("Ошибка при загрузке новостей.");
return;
}
Uri downloadUri = new Uri("shared/transfers/" + strRSSFileName, UriKind.RelativeOrAbsolute);
transferRequest.DownloadLocation = downloadUri;
transferRequest.TransferStatusChanged += new EventHandler<BackgroundTransferEventArgs>
(transferRequest_TransferStatusChanged);
try
{
BackgroundTransferService.Add(transferRequest);
}
catch (Exception ex)
{
MessageBox.Show("Невозможно запустить фоновую загрузку:" + ex.Message);
}
}
По завершении загрузки будем удалять фоновую загрузку, затем копировать загруженный файл из папки "/shared/transfers/" в корень изолированного хранилища, а затем работать с файлом, как прежде.
void transferRequest_TransferStatusChanged(object sender, BackgroundTransferEventArgs e)
{
//если скачивание прошло успешно - копируем файл и обновляем UI
if (e.Request.TransferStatus == TransferStatus.Completed)
{
try
{
BackgroundTransferService.Remove(e.Request);
}
catch (Exception ex)
{
MessageBox.Show("Невозможно удалить завершенную фоновую загрузку:" + ex.Message);
}
using (IsolatedStorageFile rssStore = IsolatedStorageFile.GetUserStoreForApplication())
{
string strRSSFileName = "";
switch (m_nRssLoadIndex)
{
case 0:
strRSSFileName = strIStoragePolit;
break;
case 1:
strRSSFileName = strIStorageEconom;
break;
case 2:
strRSSFileName = strIStorageSport;
break;
case 3:
strRSSFileName = strIStorageMusic;
break;
case 4:
strRSSFileName = strIStorageMsdn;
break;
default:
MessageBox.Show("Ошибка при загрузке новостей.");
return;
//break;
}
if (rssStore.FileExists("/shared/transfers/" + strRSSFileName))
{
rssStore.CopyFile("/shared/transfers/" + strRSSFileName, strRSSFileName, true);
string strRSSNews = LoadFromIsolatedStorage(strRSSFileName);
ParseAndDislayRSS(strRSSNews, false);
}
}
}
}
Теперь всю функциональность, касающуюся WebClient, можно убрать.
