Android Tutorial Twitter feed reader (deutsch)

klaus

Expert
Licensed User
Longtime User
(Benötigt Basic4android v1.2 oder höher)
Bitte lesen Sie zuerst Services tutorial (englisch) oder Services Module (deutsch).

Der Sourcecode zu diesem Beispiel befindet am Ende.
Der Englische Originaltext.

Das Twitter Beispiel liest RSS feeds von einer spezifischen Anfrage (query) und zeigt das Resultat an:

twitter_1.png


Wenn man auf einen Eintrag klickt, der einen Link enthält, dann wird der Browser mit diesem Link geöffnet.

Wenn die "Update automatically" (automatisch Aktualisieren) Option aktiviert ist, wenn man eine Anfrage (query) übergibt, dann wird das Hintergrund-Service diese Anfrage alle 3 Minuten neu übergeben.

Dann, wenn die Activity sichtbar ist, wird sie aktualisiert, ansonsten wird eine Benachrichtigung in der Statusbar angezeigt die den Benutzer benachrichtet daß neue Einträge bereit sind.

Die neueste Nachricht wird angezeigt wenn der Benutzer das Nachrichtenfeld öffnet:

twitter_2.png


Die automatische Aktualisierung läuft solange bis der Benutzer die "Update automatically" Option desaktiviert.


Der Code besteht aus 3 Modulen:
- Main - die Hauptactivity
- RSSReader - das Service das die Rückgabe herunterladet und analysiert
- SavedTwits - Codemodul das die Twitliste verwaltet, sie in eine Datei speichert und sie zurück liest wenn sie wieder gebraucht wird.

Starten des Service erfolgt, wenn der Benutzer auf die Go-Taste drückt (oder auf der Tastatur auf die Done Taste drückt):
B4X:
Sub btnGo_Click
    If EditText1.Text.Length = 0 Then
        ToastMessageShow("Please enter your query.", True)
        Return
    End If
    RssReader.Query = EditText1.Text
    RssReader.shouldScheduleNextTask = chkAutomatic.Checked
    StartService(RssReader)    
End Sub
Bevor wir das Service starten, setzten wir zwei Prozess globale Variablen, die Anfrage (query) und ob der Benutzer eine automatische Aktualisierung wünscht.

Der Code in Service_Start ist:
B4X:
Sub Service_Start
    'schedule the next run in 3 minutes
    If shouldScheduleNextTask Then
        StartServiceAt("", DateTime.Now + 3 * DateTime.TicksPerMinute, False)
    End If
    Dim req As HttpRequest
    req.InitializeGet(URL & su.EncodeUrl(Query, "UTF8"))
    HC.Execute(req, 1)
End Sub
Zuerst überprüfen wir ob wir eine andere Anfrage in den nächsten 3 Minuten planen müssen. Dies wird dazu führen, daß sich die Anfrage alle 3 Minuten selbst wiederholt (sie wird sich jedesmal selbst neu aufrufen).
Beachten Sie daß, wenn das Gerät inaktiv ist, die Aufgabe solange warten wird bis das Gerät wieder aktiv ist.
Dann übertragen wir HttpRequest und lesen asynchron die Daten (stream).

Es ist sehr wichtig zu verstehen daß der ganze Prozess irgendwann zerstört wird und nachher wieder neu erstellt wird wenn es Zeit zur nächsten Anfrage ist.
Das heißt daß jedes mal wenn die Activity inaktiv wird (paused) müssen wir den aktuellen Stand speichern. Später wenn die Activity wieder neu erstellt wird oder das Service erstellt wird können wir den Stand zurück lesen um richtig zu starten.
Ein Map Objekt zusammen mit File.ReadMap und File.WriteMap machen es viel einfacher den Stand zu speichern und zurückzurufen. Eine Map enthält Werte Paare, ein Schlüsselwort und sein Gegenwert

Wenn die Activity gestartet wird überprüfen wir ob es das erste mal ist. Das erstemal heißt, das erstemal seit dem Start des Prozesses der die Activity enthält.
B4X:
Sub Activity_Create(FirstTime As Boolean)
    If FirstTime Then
        'load previous values if file exists
        If File.Exists(File.DirInternal, "state.txt") Then
            state = File.ReadMap(File.DirInternal, "state.txt")
            Log(state)
        Else
            state.Initialize
        End If
    End If
    Activity.LoadLayout("1")
    'load the previous state or set the defaults if this is the first time.
    'GetDefault returns the stored value or the second parameter if the key was not found.
    EditText1.Text = state.GetDefault("EditText1", "#android")
    chk
Und Service_Create
B4X:
Sub Service_Create
    If Query = "" Then
        'no query means that the process was killed.
        'so we load the query from the state file saved by the activity.
        Dim state As Map
        state = File.ReadMap(File.DirInternal, "state.txt")
        Query = state.Get("EditText1")
        Log("Loading query from file.")
    End If

...Und da wir über Twitter sprechen, seit Ihr Alle willkommen uns auf Twitter zu verfolgen.

Der Sourcecode:
zip.gif
TwitterDemo.zip (40.5 KB, 10 views)
Twitter.apk (122.9 KB, 4 views)
 
Last edited:
Top