HttpUtils besteht aus einem Code-Modul und ein Service-Modul. Diese beiden Module machen es sehr einfach Online-Ressourcen herunterzuladen.
Die Vorteile der Verwendung von HttpUtils sind:
Ein einfaches Beispiel für das Herunterladen einer Seite und die Rückgabe der Seite als String:
Zuerst konfiguriert man die Callback-Subs. Dann rufen wir HttpUtils.Download oder HttpUtils.DownloadList auf. Diese Anrufe senden einen Job-Request HttpUtils.
Ein Job besteht aus einem oder mehreren Links.
HttpUtils löst zwei Arten von Events während der Verarbeitung eines Jobs aus. Das UrlDone Event wird für jeden erfolgreichen Download mit dem Download-URL ausgelöst und das JobDone Event wird ausgelöst wird ausgelöst, wenn der ganze Job beendet ist.
Man kann keinen neuen Job aufrufen währendem ein Job läuft (ein Job kann jedoch viele Links enthalten).
Wir haben drei Möglichkeiten auf heruntergeladene Resourcen zuzugreifen:
Nach dem Herunterladen einer Ressource, dient die URL als Schlüssel (key) für diese Ressource.
Innerhalb einer JobDone Event-Subroutine sollten Sie HttpUtils.IsSuccess vor dem Zugriff auf eine beliebige URL aufrufen, da es möglich ist, daß einige oder alle der Downloads gescheitert sind. Dies ist nicht für das UrlDone Event notwendig da UrlDone für jeden erfolgreichen Download aufgerufen wird.
Zweites Beispiel:
In diesem Beispiel wir zuerst ein Bild heruntergeladen und als Activity-Hintergrund gesetzt. Dann laden wir weitere 6 URLs und drucken den letzten als String aus. Der Code für dieses Beispiel ist beigefügt
Was passiert wenn der Benutzer während einem Download auf die Home Taste drückt?
Der Download wird erfolgreich zu Ende geführt (wir benutzen ein Service für diese Aufgabe).
Die Activity wird jedoch angehalten (paused) und die UrlDone und JobDone Events werden nicht ausgelöst.
Wenn unsere Activity 'resumed' wird müssen wir prüfen ob wir etwas verpaßt haben. Das wird mit diesem Code gemacht:
Wir rufen JobDone selbst auf, wenn nötig.
In Sub JobDone setzen wir den Complete Flag zurück, damit wissen wir, daß dieser Job behandelt wurde.
Das UrlDone Event sollte als ein "schön zu haben" Feature betrachtet werden. Ihr Code sollte vorbereitet sein den Fall zu behandeln, wenn einige UrlDone Events, während dem Anhalten der Activity, verfehlt wurden.
Das FlickrViewer Beispiel wurde umgeschrieben, und der beigefügte Code verwendet dieses Modul.
In diesem Beispiel gehen wir zunächst auf die "Haupt "-Seite. Auf dieser Seite finden wir 9 Links zu 9 Bildern. Wir senden einen zweiten Job mit all diesen Links.
Wir zeigen jedes Bild mit dem UrlDone Event an, sobald es fertig ist.
In JobDone überprüfen wir, ob alle URLs behandelt wurden. Wir können einige dieser Events vermissen, wenn die Activity während des Downloads angehalten (paused) wurde.
HttpUtils, ähnlich wie DBUtils, soll gewöhnliche Aufgaben erleichtern, die sich jedem Entwickler stellen. Der Code steht für Sie zur Verfügung. Sie können ihn nach Bedarf ändern.
Das Englische Original-Tutorial.
Mehr Möglichkeiten werden in Zukunft dazu kommen.
Dateien:
FlickrViewer.zip
HttpUtilsExample.zip
Die Vorteile der Verwendung von HttpUtils sind:
- Viel einfacher als direkt mit HttpClient zu arbeiten.
- Behandelt parallele Aufrufe effizienter und richtig (schützt vor RejectedExecutionException Exceptions).
- Downloads sind nicht von der Activity-Lebensdauer betroffen.
Ein einfaches Beispiel für das Herunterladen einer Seite und die Rückgabe der Seite als String:
B4X:
Sub Globals
Dim b4a As String
b4a = "http://www.b4x.com"
End Sub
Sub Activity_Create (FirstTime As Boolean)
HttpUtils.CallbackActivity = "Main" 'Current activity name.
HttpUtils.CallbackJobDoneSub = "JobDone"
HttpUtils.Download("Job1", b4a)
End Sub
Sub JobDone (Job As String)
Dim s As String
If HttpUtils.IsSuccess(b4a) Then
s = HttpUtils.GetString(b4a)
End If
End Sub
Ein Job besteht aus einem oder mehreren Links.
HttpUtils löst zwei Arten von Events während der Verarbeitung eines Jobs aus. Das UrlDone Event wird für jeden erfolgreichen Download mit dem Download-URL ausgelöst und das JobDone Event wird ausgelöst wird ausgelöst, wenn der ganze Job beendet ist.
Man kann keinen neuen Job aufrufen währendem ein Job läuft (ein Job kann jedoch viele Links enthalten).
Wir haben drei Möglichkeiten auf heruntergeladene Resourcen zuzugreifen:
- HttpUtils.GetString(Url As String) – Gibt die Resource als String zurück
- HttpUtils.GetBitmap(Url As String) - Gibt die Resource als Bitmap zurück
- HttpUtils.GetInputStream(Url As String) – Gibt einen InputStream zurück der ein manuelles lesen der heruntergeladenen der Resource erlaubt.
Nach dem Herunterladen einer Ressource, dient die URL als Schlüssel (key) für diese Ressource.
Innerhalb einer JobDone Event-Subroutine sollten Sie HttpUtils.IsSuccess vor dem Zugriff auf eine beliebige URL aufrufen, da es möglich ist, daß einige oder alle der Downloads gescheitert sind. Dies ist nicht für das UrlDone Event notwendig da UrlDone für jeden erfolgreichen Download aufgerufen wird.
Zweites Beispiel:
In diesem Beispiel wir zuerst ein Bild heruntergeladen und als Activity-Hintergrund gesetzt. Dann laden wir weitere 6 URLs und drucken den letzten als String aus. Der Code für dieses Beispiel ist beigefügt
B4X:
Sub Process_Globals
Dim ImageUrl As String
ImageUrl = "http://www.b4x.com/android/images/logo2.png"
Dim Job2Links As List
End Sub
Sub Globals
End Sub
Sub Activity_Create(FirstTime As Boolean)
HttpUtils.CallbackActivity = "Main"
HttpUtils.CallbackJobDoneSub = "JobDone"
HttpUtils.CallbackUrlDoneSub = "UrlDone"
Job2Links.Initialize
Job2Links.AddAll(Array As String( _
"http://www.google.com", "http://www.yahoo.com", _
"http://www.bing.com", "http://www.cnn.com", _
"http://www.twitter.com", "http://www.facebook.com"))
HttpUtils.Download("Job1", ImageUrl)
End Sub
Sub Activity_Resume
'Check whether a job has finished while the activity was paused.
If HttpUtils.Complete = True Then JobDone(HttpUtils.Job)
End Sub
Sub UrlDone(Url As String)
Log(Url & " done")
End Sub
Sub JobDone (Job As String)
Select Job
Case "Job1"
If HttpUtils.IsSuccess(ImageUrl) Then
Dim b As Bitmap
b = HttpUtils.GetBitmap(ImageUrl)
Activity.SetBackgroundImage(b)
End If
'Start the second job
HttpUtils.DownloadList("Job2", Job2Links)
Case "Job2"
For i = 0 To HttpUtils.Tasks.Size - 1
link = HttpUtils.Tasks.Get(i)
Log(link & ": success=" & HttpUtils.IsSuccess(link))
Next
If HttpUtils.IsSuccess("http://www.google.com") Then
Log(HttpUtils.GetString("http://www.google.com"))
End If
End Select
HttpUtils.Complete = False 'Turn off the complete flag so we won't handle it again if the activity is resumed.
End Sub
Der Download wird erfolgreich zu Ende geführt (wir benutzen ein Service für diese Aufgabe).
Die Activity wird jedoch angehalten (paused) und die UrlDone und JobDone Events werden nicht ausgelöst.
Wenn unsere Activity 'resumed' wird müssen wir prüfen ob wir etwas verpaßt haben. Das wird mit diesem Code gemacht:
B4X:
Sub Activity_Resume
'Check whether a job has finished while the activity was paused.
If HttpUtils.Complete = True Then JobDone(HttpUtils.Job)
End Sub
In Sub JobDone setzen wir den Complete Flag zurück, damit wissen wir, daß dieser Job behandelt wurde.
Das UrlDone Event sollte als ein "schön zu haben" Feature betrachtet werden. Ihr Code sollte vorbereitet sein den Fall zu behandeln, wenn einige UrlDone Events, während dem Anhalten der Activity, verfehlt wurden.
Das FlickrViewer Beispiel wurde umgeschrieben, und der beigefügte Code verwendet dieses Modul.
In diesem Beispiel gehen wir zunächst auf die "Haupt "-Seite. Auf dieser Seite finden wir 9 Links zu 9 Bildern. Wir senden einen zweiten Job mit all diesen Links.
Wir zeigen jedes Bild mit dem UrlDone Event an, sobald es fertig ist.
In JobDone überprüfen wir, ob alle URLs behandelt wurden. Wir können einige dieser Events vermissen, wenn die Activity während des Downloads angehalten (paused) wurde.
HttpUtils, ähnlich wie DBUtils, soll gewöhnliche Aufgaben erleichtern, die sich jedem Entwickler stellen. Der Code steht für Sie zur Verfügung. Sie können ihn nach Bedarf ändern.
Das Englische Original-Tutorial.
Mehr Möglichkeiten werden in Zukunft dazu kommen.
Dateien:
Last edited: