{31 день с Mango} День 26: фоновая передача файлов

Это День 26 в серии статей 31 день с Mango (перевод оригинальной серии 31 Days of Mango), и был написан приглашенным автором Gary Johnson. Вы можете найти Gary в твиттере @GaryGJohnson.
В прошлый раз мы создавали проект с использованием фонового агента, одной из новых возможностей многозадачности в Windows Phone 7.5. Сегодня мы будем использовать фоновую передачу файлов для выполнения загрузки файлов, которая продолжается даже тогда, когда наше приложение не запущено. Мы будем загружать видео с известного многим Channel 9 и проигрывать его после завершения скачивания.
Запустите Visual Studio и создайте новый проект. В разделе Silverlight for Windows Phone, выберите Windows Phone Application. Назовите его «MyFileTransferApp».

Вы создали основное приложение. Он будет отвечать за:
1) Инициацию скачивания видео.
2) Отображение статуса скачивания.
3) Однократное проигрывание видео после завершения загрузки.

Теперь настало время, чтобы реализовать всю необходимую функциональность. Откройте MainPage.xaml и добавить две кнопки для загрузки и воспроизведения видео. Затем добавьте два TextBlock для отображения хода загрузки и статуса.

<StackPanel VerticalAlignment="Center">
 <Button x:Name="downloadButton" Click="downloadButton_Click">Start Download</Button>
 <Button x:Name="playVideoButton" Click="playVideo_Click" IsEnabled="False">Play Video</Button>
 <TextBlock x:Name="progressText" Margin="10"/>
 <TextBlock x:Name="statusText" Margin="10"/>
 </StackPanel>

Я не буду приводить здесь полное содержимое MainPage.xaml.cs здесь, но оно доступно в прилагаемом проекте. Во-первых, мы определим некоторые переменные экземпляра: для хранения расположения нашего загружаемого видео с которого видео будет скачиваться, для храения расположения, где мы будем сохранять видео, а также текущего запроса передачи данных:

 private const String SAVE_LOCATION = "shared/transfers/MyDownloadedVideo.mp4";
 private Uri videoDownloadUri = new Uri("http://video.ch9.ms/ch9/02df/0a2774a9-a010-4b9b-b654-9f88014102df/xboxCompanion_med_ch9.mp4");
 private Uri saveLocationUri = new Uri(SAVE_LOCATION, UriKind.RelativeOrAbsolute);
 private BackgroundTransferRequest _currentRequest = null;

Обратите внимание, что при загрузке непосредственно в изолированное хранилище, все загрузки будут происходить в  shared/transfers/. Мы будем загружать видео из Channel 9 и сохранять его как «MyDownloadedVideo.mp4».

Когда пользователь нажимает кнопку «Start Download», мы создадим новый BackgroundTransferRequest и скажем ему, что мы хотим загрузить, и где мы хотим сохранить загруженное. По умолчанию загрузка может быть выполнена только когда устройство подключено к питанию и имеет Wi-Fi соединение. Мы это настроим, присвоив для BackgroundTransferRequest.TransferPreferences значение AllowCellularAndBattery. Наконец, мы добавим наш запрос к BackgroundTransferService.

_currentRequest = new BackgroundTransferRequest(videoDownloadUri, saveLocationUri);
 _currentRequest.TransferPreferences = TransferPreferences.AllowCellularAndBattery;
 BackgroundTransferService.Add(_currentRequest);

Мы также должны быть уведомлены о статусе запроса и ходе скачивания, чтобы мы могли обновить наш пользовательский интерфейс. Мы можем подписаться на изменения путем обработки событий TransferProgressChanged и TransferStatusChanged :

_currentRequest.TransferProgressChanged += new EventHandler<BackgroundTransferEventArgs>(_currentRequest_TransferProgressChanged);
_currentRequest.TransferStatusChanged += new EventHandler<BackgroundTransferEventArgs>(_currentRequest_TransferStatusChanged);

Когда мы получаем уведомление об этих событиях, мы можем проверить несколько свойств нашего BackgroundTransferRequest, чтобы увидеть текущее состояние загрузки:
BytesRecieved / TotalBytesToRecieve для хода загрузки
BytesSent / TotalBytesToSend для хода отправки
TransferStatus для текущего статуса скачивание (передача данных, завершено, и т.д.)
TransferError для информации о неудачной передаче данных.

Обратите внимание, что даже если передача данных не была успешной, TransferStatus сообщит Completed по завершении. Из-за этого, как только TransferStatus выдаст статус Completed, вы должны проверить TransferError чтобы увидеть произошла ли ошибка.
Когда передача данных завершена, вы должны удалить её запрос из BackgroundTransferService:

BackgroundTransferService.Remove(_currentRequest);

Наконец, один из сложных аспектов осуществления фоновой передачи файлов после закрытия приложения. Когда мы вновь входим в приложение, мы должны продолжить обновление нашего статуса, и если _currentRequest будет нулевым, то  наши события уже не отслеживаются. Чтобы справиться с этим, мы сбрасываем наш _currentRequest и подключаем события в OnNavigatedTo:

protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
    base.OnNavigatedTo(e);
    foreach (BackgroundTransferRequest request in BackgroundTransferService.Requests)
    {
        _currentRequest = request;
        break;
    }
    InitializeCurrentTransferRequest();
    InitializeTransferRequestEventHandlers();
    RefreshTransferUI();
}

По функциональности этот пример является сильно упрощенным. Рекомендуется, чтобы вы также прочли обзор MSDN Фоновая передача данных для более полного использования этой возможности.

Теперь, когда наше приложение готово к работе, установите его на устройство или эмулятор Windows Phone и запустите MyFileTransferApp. Нажмите кнопку «Start Download», отобразится состояние загрузки:

Нажмите кнопку телефона Пуск и выйдите из приложения.  Подождите некоторое время, а затем снова откройте приложение. Вы должны заметить, что процесс загрузки продолжается даже тогда, когда приложение не запущено. Как только статус станет Complete, вы можете нажать кнопку «Play Video», чтобы посмотреть видео, которое было загружено.

Итак, сегодня мы создали BackgroundTransferRequest, который загружает видео. При выполнении запросов на передачу данных, имейте в виду то, что мы упомянули:
— Запустите BackgroundTransferRequest и добавте его в BackgroundTransferService чтобы начать загружать или выгружать данные
— При сохранении в изолированном хранилище загружаемые файлы сохраняются в share/transfers/
— Идентификаторы событий BackgroundTransferRequest.TransferProgressChanged и BackgroundTransferRequest.TransferStatusChanged будут проинформированы об изменениях в состоянии передачи данных
— Когда  BackgroundTransferRequest.TransferStatus имеет статус Complete не забудьте проверить BackgroundTransferRequest.TransferError, чтобы убедиться была ли передача данных успешной
— управляйте сценарием приложения, когда пользователь покидает и возвращается в ваше приложение
Вы можете скачать полный проект этого примера: скачать.
Завтра, Parag Joshi вернётся, чтобы рассказать о Microphone API, и как мы можем использовать его для захвата звука с устройства Windows Phone.
До встречи!

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *