Dieser Artikel ist Tag #26 der Serie 31 Tage Mango von Jeff Blankenburg.
Der Originalartikel befindet sich hier: Day #26: Background File Transfer.
Dieser Artikel wurde in der Originalserie von Gastautor Gary Johnson geschrieben. Bei Twitter kann Gary unter @GaryGJohnson erreicht werden.
Gestern haben wir ein Projekt mit einer Hintergrundaufgabe — einem der neuen Multitasking Features in Windows Phone 7.5 — erstellt. Heute werden wir Background File Transfer verwenden, um eine Datei herunterzuladen, auch wenn unsere Anwendung nicht läuft. Wir werden ein Video von Channel 9 herunterladen und es nach dem Herunterladen abspielen.
Erste Schritte
Starten Sie das Visual Studio und erstellen Sie ein neues Projekt. Wählen Sie Windows Phone Application aus Silverlight for Windows Phone. Nennen Sie das Projekt „MyFileTransferApp“.
Wir haben jetzt unsere Hauptanwendung. Sie wird folgende Aufgaben übernehmen:
- Sie startet den Download des Videos.
- Sie zeigt den Status des Downloads an.
- Sie wird das Video abspielen, sobald der Download abgeschlossen ist.
Erstellung der Anwendung
Jetzt werden wir alles verkabeln. Öffnen Sie die Datei MainPage.xaml und fügen Sie zwei Buttons hinzu — einen für den Download des Videos und einen für das Abspielen. Weiterhin fügen Sie zwei TextBlocks ein um den Fortschritt und Status des Downloads anzuzeigen.
<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 werde hier nicht den ganzen Code für die MainPage.xaml.cs zeigen — er ist aber unten im Download der kompletten Solution enthalten. Wir deklarieren einige Instanzvariablen, um uns zu merken, wo das Video liegt, wo wir es speichern und um uns den aktuell laufenden Hintergrunddownload zu merken (in Form des BackgroundTransferRequest):
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 Isolated Storage herunterladen möchten, müssen alle Downloads unter shared/transfers/ gespeichert werden. Wir werden das Video direkt von Channel 9 runterladen und es unter dem Namen „MyDownloadedVideo.mp4“ abspeichern.
Wenn der Anwender auf „Start Download“ klickt, erstellen wir einen neuen BackgroundTransferRequest und teilen ihm mit, was wir herunterladen möchten und wo der Download gespeichert werden soll. Standardmäßig kann ein Download nur ausgeführt werden, wenn das Gerät eine Strom- und WLAN-Verbindung hat. Wir passen diese Einstellung BackgroundTransferRequest.TransferPreferences an auf AllowCellularAndBattery. Zuletzt fügen wir unsere Downloadanfrage dem BackgroundTransferService hinzu.
_currentRequest = new BackgroundTransferRequest(videoDownloadUri, saveLocationUri); _currentRequest.TransferPreferences = TransferPreferences.AllowCellularAndBattery; BackgroundTransferService.Add(_currentRequest);
Wir wollen uns über den Status und Fortschritt des Downloads benachrichtigen lassen, damit wir die Benutzeroberfläche entsprechend aktualiseren können. Wir können uns hierzu für die Events TransferProgressChanged und TransferStatusChanged registrieren:
_currentRequest.TransferProgressChanged += new EventHandler<BackgroundTransferEventArgs>(_currentRequest_TransferProgressChanged); _currentRequest.TransferStatusChanged += new EventHandler<BackgroundTransferEventArgs>(_currentRequest_TransferStatusChanged);
Wenn wir durch diese Ereignisse benachrichtigt werden, können wir einige Eigenschaften des BackgroundTransferRequest abfragen, um den aktuellen Zustand unseres Downloads zu prüfen:
- Bytes Received / TotalBytesToReceive für den Fortschritt des Downloads.
- Bytes Sent / TotalBytesToSend für den Fortschritt eines Uploads.
- TransferStatus für den aktuellen Status des Downloads (übertragend, abgeschlossen, etc.).
- TransferError für Informationen über eine fehlgeschlagene Übertragung.
Unabhängig davon, ob die Übertragung erfolgreich war, wird TransferStatus am Ende den Wert Completed haben. Deshalb sollten Sie den Wert von TransferError auf mögliche Fehler prüfen, sobald TransferStatus den Wert Completed hat.
Wenn die Übertragung abgeschlossen ist, sollten Sie diese vom BackgroundTransferService entfernen:
BackgroundTransferService.Remove(_currentRequest);
Schließlich fehlt uns noch die etwas knifflige Behandlung des Falls, dass die Anwendung während der Übertragung beendet wird. Wenn wir die App wieder öffnen, wollen wir den Status wieder aktualisieren obwohl _currentRequest dann null sein wird und unsere Event Handlers nicht mehr korrekt verkabelt sein werden. Wir setzen deshalb den _currentRequest und die Event Handlers in 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(); }
Dieses Beispiel funktioniert zwar, ist aber extrem vereinfacht. Ich empfehle Ihnen die Lektüre von Background File Transfers Overview auf MSDN für einen kompletten Überblick.
Die Anwendung ausführen
Unsere Anwendung ist jetzt bereit zur Ausführung. Installieren Sie sie im Emulator oder auf einem Gerät und starten Sie MyFileTransferApp. Klicken Sie auf „Start Download“ und Sie sollten den Fortschritt des Downloads angezeigt bekommen:
Drücken Sie den Hardware Button Start um die Anwendung zu verlassen. Warten Sie eine Weile und öffnen die Anwendung wieder. Sie sollten am Fortschritt feststellen können, dass der Download weiterging obwohl die Anwendung nicht lief. Sobald die Übertragung abgeschlossen ist, können Sie auf „Play Video“ klicken, um das heruntergeladene Video abzuspielen.
Zusammenfassung
So, heute haben wir einen BackgroundTransferRequest zum Download eines Videos erstellt. Wenn Sie selber Hintergrunddownloads implementieren wollen, behalten Sie das folgende im Hinterkopf:
- Erstellen Sie einen BackgroundTransferRequest und fügen Sie diesen dem BackgroundTransferService hinzu.
- Speichern Sie Downloads im Isolated Storage unter share/transfers/
- Behandeln Sie die Ereignisse BackgroundTransferRequest.TransferProgressChanged und BackgroundTransferRequest.TransferStatusChanged um über den aktuellen Zustand der Übertragung informiert zu werden.
- Wenn der BackgroundTransferRequest.TransferStatus Complete meldet, vergessen Sie nicht, BackgroundTransferRequest.TransferError zu prüfen, um zu sehen, ob die Übertragung auch erfolgreich war.
- Behandeln Sie den Fall, dass der Benutzer die App verlässt und wieder zurückkehrt.
Um ein Windows Phone Projekt mit dem gesamten Code dieses Artikels herunterzuladen, klicken Sie auf den Download Code Button unten:
Morgen wird Parag Joshi zurückkommen und uns die Microphone API näherbringen.
Bis dahin!