Android Tutorial HttpUtils - Android Webservices ganz einfach

klaus

Expert
Licensed User
Longtime User
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:
  • 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.
HttpUtils benutzen

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
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:
  • 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.
Diese drei Methoden sollten nur aufgerufen werden, nachdem der Job erledigt ist oder innerhalb der UrlDone Event-Subroutine (für die jeweilige URL).
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
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:
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
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.

flickr_viewer1.png


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:
zip.gif
FlickrViewer.zip
zip.gif
HttpUtilsExample.zip
 
Last edited:
Top