Georg fährt extra nach Berlin um Steve Ballmer zu treffen

31 Tage Mango | Tag #26: Background File Transfer

Die­ser Arti­kel ist Tag #26 der Serie 31 Tage Man­go von Jeff Blan­ken­burg.

Der Ori­gi­nal­ar­ti­kel befin­det sich hier: Day #26: Back­ground File Trans­fer.

Die­ser Arti­kel wur­de in der Ori­gi­nal­se­rie von Gast­au­tor Gary John­son geschrie­ben. Bei Twit­ter kann Gary unter @GaryGJohnson erreicht wer­den.

Ges­tern haben wir ein Pro­jekt mit einer Hin­ter­grund­auf­ga­be — einem der neu­en Mul­ti­tas­king Fea­tures in Win­dows Pho­ne 7.5 — erstellt. Heu­te wer­den wir Back­ground File Trans­fer ver­wen­den, um eine Datei her­un­ter­zu­la­den, auch wenn unse­re Anwen­dung nicht läuft. Wir wer­den ein Video von Chan­nel 9 her­un­ter­la­den und es nach dem Her­un­ter­la­den abspie­len.

Erste Schritte

Star­ten Sie das Visu­al Stu­dio und erstel­len Sie ein neu­es Pro­jekt. Wäh­len Sie Win­dows Pho­ne App­li­ca­ti­on aus Sil­ver­light for Win­dows Pho­ne. Nen­nen Sie das Pro­jekt „MyFi­le­Trans­fe­rApp“.

Wir haben jetzt unse­re Haupt­an­wen­dung. Sie wird fol­gen­de Auf­ga­ben über­neh­men:

  1. Sie star­tet den Down­load des Vide­os.
  2. Sie zeigt den Sta­tus des Down­loads an.
  3. Sie wird das Video abspie­len, sobald der Down­load abge­schlos­sen ist.

Erstellung der Anwendung

Jetzt wer­den wir alles ver­ka­beln. Öff­nen Sie die Datei MainPage.xaml und fügen Sie zwei But­tons hin­zu — einen für den Down­load des Vide­os und einen für das Abspie­len. Wei­ter­hin fügen Sie zwei Text­Blocks ein um den Fort­schritt und Sta­tus des Down­loads anzu­zei­gen.

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

Ich wer­de hier nicht den gan­zen Code für die MainPage.xaml.cs zei­gen — er ist aber unten im Down­load der kom­plet­ten Solu­ti­on ent­hal­ten. Wir dekla­rie­ren eini­ge Instanz­va­ria­blen, um uns zu mer­ken, wo das Video liegt, wo wir es spei­chern und um uns den aktu­ell lau­fen­den Hin­ter­grund­down­load zu mer­ken (in Form des Back­ground­Trans­fer­Re­quest):

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; 

Wenn Sie direkt in Iso­la­ted Sto­rage her­un­ter­la­den möch­ten, müs­sen alle Down­loads unter shared/transfers/ gespei­chert wer­den. Wir wer­den das Video direkt von Chan­nel 9 run­ter­la­den und es unter dem Namen „MyDownloadedVideo.mp4“ abspei­chern.

Wenn der Anwen­der auf „Start Down­load“ klickt, erstel­len wir einen neu­en Back­ground­Trans­fer­Re­quest und tei­len ihm mit, was wir her­un­ter­la­den möch­ten und wo der Down­load gespei­chert wer­den soll. Stan­dard­mä­ßig kann ein Down­load nur aus­ge­führt wer­den, wenn das Gerät eine Strom- und WLAN-Ver­bin­dung hat. Wir pas­sen die­se Ein­stel­lung BackgroundTransferRequest.TransferPreferences an auf Allow­Cel­lu­lar­And­Bat­te­ry. Zuletzt fügen wir unse­re Down­load­an­fra­ge dem Back­ground­Trans­fer­Ser­vice hin­zu.

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

Wir wol­len uns über den Sta­tus und Fort­schritt des Down­loads benach­rich­ti­gen las­sen, damit wir die Benut­zer­ober­flä­che ent­spre­chend aktua­li­se­ren kön­nen. Wir kön­nen uns hier­zu für die Events Trans­fer­Pro­gressChan­ged und Trans­fer­Sta­tusCh­an­ged regis­trie­ren:

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

Wenn wir durch die­se Ereig­nis­se benach­rich­tigt wer­den, kön­nen wir eini­ge Eigen­schaf­ten des Back­ground­Trans­fer­Re­quest abfra­gen, um den aktu­el­len Zustand unse­res Down­loads zu prü­fen:

  • Bytes Recei­ved / Total­By­tes­To­Re­cei­ve für den Fort­schritt des Down­loads.
  • Bytes Sent / Total­By­tesTo­Send für den Fort­schritt eines Uploads.
  • Trans­fer­Sta­tus für den aktu­el­len Sta­tus des Down­loads (über­tra­gend, abge­schlos­sen, etc.).
  • Trans­fe­rEr­ror für Infor­ma­tio­nen über eine fehl­ge­schla­ge­ne Über­tra­gung.

Unab­hän­gig davon, ob die Über­tra­gung erfolg­reich war, wird Trans­fer­Sta­tus am Ende den Wert Com­ple­ted haben. Des­halb soll­ten Sie den Wert von Trans­fe­rEr­ror auf mög­li­che Feh­ler prü­fen, sobald Trans­fer­Sta­tus den Wert Com­ple­ted hat.

Wenn die Über­tra­gung abge­schlos­sen ist, soll­ten Sie die­se vom Back­ground­Trans­fer­Ser­vice ent­fer­nen:

BackgroundTransferService.Remove(_currentRequest); 

Schließ­lich fehlt uns noch die etwas kniff­li­ge Behand­lung des Falls, dass die Anwen­dung wäh­rend der Über­tra­gung been­det wird. Wenn wir die App wie­der öff­nen, wol­len wir den Sta­tus wie­der aktua­li­sie­ren obwohl _currentRequest dann null sein wird und unse­re Event Hand­lers nicht mehr kor­rekt ver­ka­belt sein wer­den. Wir set­zen des­halb den _currentRequest und die Event Hand­lers in OnNavi­ga­ted­To:

protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
   base.OnNavigatedTo(e);

   foreach (BackgroundTransferRequest request in BackgroundTransferService.Requests)
   {
      _currentRequest = request;
      break;
   }

   InitializeCurrentTransferRequest();
   InitializeTransferRequestEventHandlers();
   RefreshTransferUI();
} 

Die­ses Bei­spiel funk­tio­niert zwar, ist aber extrem ver­ein­facht. Ich emp­feh­le Ihnen die Lek­tü­re von Back­ground File Trans­fers Over­view auf MSDN für einen kom­plet­ten Über­blick.

Die Anwendung ausführen

Unse­re Anwen­dung ist jetzt bereit zur Aus­füh­rung. Instal­lie­ren Sie sie im Emu­la­tor oder auf einem Gerät und star­ten Sie MyFi­le­Trans­fe­rApp. Kli­cken Sie auf „Start Down­load“ und Sie soll­ten den Fort­schritt des Down­loads ange­zeigt bekom­men:

Drü­cken Sie den Hard­ware But­ton Start um die Anwen­dung zu ver­las­sen. War­ten Sie eine Wei­le und öff­nen die Anwen­dung wie­der. Sie soll­ten am Fort­schritt fest­stel­len kön­nen, dass der Down­load wei­ter­ging obwohl die Anwen­dung nicht lief. Sobald die Über­tra­gung abge­schlos­sen ist, kön­nen Sie auf „Play Video“ kli­cken, um das her­un­ter­ge­la­de­ne Video abzu­spie­len.

Zusammenfassung

So, heu­te haben wir einen Back­ground­Trans­fer­Re­quest zum Down­load eines Vide­os erstellt. Wenn Sie sel­ber Hin­ter­grund­down­loads imple­men­tie­ren wol­len, behal­ten Sie das fol­gen­de im Hin­ter­kopf:

  • Erstel­len Sie einen Back­ground­Trans­fer­Re­quest und fügen Sie die­sen dem Back­ground­Trans­fer­Ser­vice hin­zu.
  • Spei­chern Sie Down­loads im Iso­la­ted Sto­rage unter share/transfers/
  • Behan­deln Sie die Ereig­nis­se BackgroundTransferRequest.TransferProgressChanged und BackgroundTransferRequest.TransferStatusChanged um über den aktu­el­len Zustand der Über­tra­gung infor­miert zu wer­den.
  • Wenn der BackgroundTransferRequest.TransferStatus Com­ple­te mel­det, ver­ges­sen Sie nicht, BackgroundTransferRequest.TransferError zu prü­fen, um zu sehen, ob die Über­tra­gung auch erfolg­reich war.
  • Behan­deln Sie den Fall, dass der Benut­zer die App ver­lässt und wie­der zurück­kehrt.

Um ein Win­dows Pho­ne Pro­jekt mit dem gesam­ten Code die­ses Arti­kels her­un­ter­zu­la­den, kli­cken Sie auf den Down­load Code But­ton unten:

Mor­gen wird Parag Joshi zurück­kom­men und uns die Micro­pho­ne API näher­brin­gen.

Bis dahin!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert