Статьи

31 Дней Манго | День № 26: Фоновая передача файлов

Эта статья является 26-м днем ​​в серии под названием « 31 день манго» и была написана приглашенным автором Гари Джонсоном. С Гэри можно связаться в Твиттере по адресу @GaryGJohnson .

Day26-BackgroundFileTransfers

Вчера мы создали проект с использованием фонового агента, одной из функций многозадачности, новой для Windows Phone 7.5. Сегодня мы будем использовать фоновую передачу файлов для загрузки файла, которая продолжается, даже когда наше приложение не запущено. Мы будем загружать видео с 9-го канала и воспроизводить его после завершения.

Начиная

Запустите Visual Studio и создайте новый проект. Под Silverlight для Windows Phone выберите Приложение для Windows Phone . Назовите это «MyFileTransferApp».

clip_image002

Вы создали главное приложение. Он будет нести ответственность за:

1) Начало загрузки нашего видео

2) Отображение статуса загрузки

3) Воспроизведение видео после завершения загрузки

Создание приложения

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

<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; 

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

Когда пользователь нажимает кнопку «Начать загрузку », мы создаем новый запрос 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, чтобы увидеть текущее состояние загрузки:

  • BytesRecieve / TotalBytesToRecieve для прогресса загрузки
  • BytesSent / TotalBytesToSend для прогресса загрузки
  • TransferStatus для текущего статуса загрузки (передача, завершение и т. Д.)
  • TransferError для получения информации о неудачной передаче.

Обратите внимание, что независимо от того, была ли передача успешной, TransferStatus сообщит о завершении после завершения. Из-за этого, как только 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. Нажмите «Начать загрузку», и вы увидите отчет о ходе загрузки:

clip_image003

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

Резюме

Итак, сегодня мы создали BackgroundTransferRequest, который загружает видео. Делая собственные запросы на перевод, имейте в виду, что мы покрывали:

  • Запустите BackgroundTransferRequest и добавьте его в BackgroundTransferService, чтобы начать загрузку или выгрузку.
  • Сохраняйте загрузки в общий доступ / передачи / при сохранении в изолированном хранилище
  • Обрабатывать события BackgroundTransferRequest.TransferProgressChanged и BackgroundTransferRequest.TransferStatusChanged, чтобы получать уведомления об изменениях в состоянии передачи
  • Когда BackgroundTransferRequest.TransferStatus завершен, не забудьте проверить BackgroundTransferRequest.TransferError, чтобы увидеть, была ли передача успешной
  • Обрабатывать сценарии, когда пользователь уходит и возвращается в ваше приложение

Чтобы загрузить полный проект Windows Phone, содержащий весь код из этой статьи, нажмите кнопку «Загрузить код» ниже.

скачать

Завтра Параг Джоши вернется, чтобы обсудить API-интерфейс для микрофона и узнать, как мы можем использовать его для захвата звука с устройства Windows Phone. Увидимся позже!

toolsbutton

Источник: http://www.jeffblankenburg.com/2011/11/26/31-days-of-mango-day-26-background-file-transfer