Лабораторный практикум 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, можно убрать.