Опубликован: 11.01.2013 | Доступ: свободный | Студентов: 623 / 124 | Длительность: 12:06:00
Лекция 5:

Лабораторный практикум 4

< Лекция 4 || Лекция 5: 12345 || Лекция 6 >

Лабораторная работа №17. Фоновая загрузка файлов

Задание

Изменить приложение "RSS-новости", добавив поддержку фоновой загрузки RSS-файлов. Добавить для приложения двусторонний тайл.

Освоение

  • фоновая загрузка файлов
  • тайлы

Описание

Откроем ранее созданный проект "RSS-новости". Добавим два изображения размера 173x173 (для тайлов). Назовем их, например, "RSSred.png" и "RSSblue.png". Установим для данных изображений свойство "Build Action" в "Content".

Примечание: тайлы – это изображения, отображающиеся на главной странице Windows Phone 7. Они могут иметь пояснительные надписи и обратную сторону – другое изображение, которое будет периодически появляться. Для того чтобы добавить тайл приложения на главную страницу, в списке приложений нажмите на ваше приложение и удерживайте. В появившемся контекстном меню выберете "pin to start" Рис. 5.2 :

Отображение тайла приложения на главной странице

Рис. 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, можно убрать.

< Лекция 4 || Лекция 5: 12345 || Лекция 6 >