Bouw een Twitter-zoekapp haal de Twitter JSON-feed op en parseer deze

Deze tweedelige tutorialserie laat je kennismaken met de basisprincipes van het werken met RESTful webservices met behulp van de Android SDK. Onderweg leert u hoe u zoekopdrachten uitvoert met de openbare Twitter API!

In deze zelfstudie gebruiken we AsyncTask om de JSON-tweets op te halen, te parseren en vervolgens weer te geven in de gebruikersinterface. Hoewel de code in deze tutorial specifiek is voor Twitter, zijn de betrokken principes van toepassing op het ophalen van veel andere webfeeds en API's met behulp van een RESTful-architectuur.

Deze tutorialserie op Android Twitter Search bestaat uit twee delen:

  • Deel 1: Bouw het zoekverzoek op
  • Deel 2: haal de Twitter JSON-feed op en parseer deze

Stap 1: Maak een Inner AsyncTask-klasse

We gaan een AsyncTask gebruiken om het fetchen, parseren en weergeven van de tweet-feed op de zoekopdracht van de gebruiker uit te voeren. Door AsyncTask te gebruiken, kunnen we verwerking in een achtergrondthread veranderen, met de resultaten nog steeds toegankelijk voor de gebruikersinterface van de app voor weergave. Voeg in de klasse Activiteit een innerlijke klasse AsyncTask toe na de searchTwitter methode:

 privéklasse GetTweets breidt AsyncTask uit 

De AsyncTask-klasse is abstract, wat betekent dat u een subklasse moet maken om deze te kunnen gebruiken. Dergelijke subklassen moeten één specifieke methode implementeren die we hierna zullen toevoegen. In de tussentijd zal Eclipse foutmeldingen weergeven (negeer ze nu gewoon).

Het AsyncTask maakt gebruik van drie generieke typen, zoals u kunt zien aan de beginregel van de klasseverklaring. De eerste specificeert het parametertype - in dit geval is dit een string omdat we de URL-reeks die we hebben gemaakt gaan doorgeven. Het middelste type is voor voortgangseenheden, die we in deze zelfstudie niet zullen gebruiken, dus we geven eenvoudig ongeldig op. Voortgangseenheden kunnen worden gebruikt om de voortgang van achtergrondtaken aan te geven. Het derde type is een andere tekenreeks, die het achtergrondproces retourneert. In ons geval wordt dit de opgehaalde JSON-feedtekst.


Stap 2: Achtergrondverwerking uitvoeren

Voeg in uw klasse AsyncTask de volgende methode toe, die we uit de bovenliggende klasse overschrijven:

 @Override protected String doInBackground (String ... twitterURL) 

Het parametertype is een tekenreeks die overeenkomt met het eerste type dat we hebben aangegeven in de openingszin van de klassenverklaring. Deze tekenreeks wordt de URL van Twitter-zoek-API die we de vorige keer hebben gemaakt. Binnen deze methode specificeren we welk achtergrondproces we willen dat het AsyncTask uitvoert. De methode retourneert ook een waarde van het type string, om overeen te komen met wat we hebben opgegeven als de derde parameter in de openingszin van de klassenaangifte. Deze geretourneerde string zal als parameter worden ontvangen voor een tweede methode, die we later zullen implementeren.

Tip: Als je onbekend bent met abstracte klassen of generieke types, maak je dan geen zorgen. Wat we hier doen is eigenlijk gewoon een patroon volgen. Net als bij een groot deel van het Android-platform, kunt u leren hoe u deze bronnen kunt gebruiken uit de voorbeelden in de Handleiding voor ontwikkelaars en, in dit geval, de API-referentie.


Stap 3: Stuur het verzoek

Het Twitter-zoekresultaat zal een string zijn, die we zullen bouwen op basis van het antwoord dat we ontvangen. Binnen in de doInBackground methode, begin met het maken van een String Builder:

 StringBuilder tweetFeedBuilder = new StringBuilder ();

Hoewel we een enkele URL-reeks gebruiken, krijgt de methode een array met objecten van het opgegeven type (string), dus laten we er doorheen lopen:

 for (String searchURL: twitterURL) 

In werkelijkheid zal de lus maar één keer worden herhaald, maar je kunt je code uitbreiden om meerdere zoekfeeds op te halen, dus we zullen voorlopig een lus gebruiken. Maak binnen de lus een HTTP-client voor het uitvoeren van de aanvraag:

 HttpClient tweetClient = nieuwe DefaultHttpClient ();

Nu moeten we I / O-uitzonderingen opsporen, zoals altijd het geval is wanneer u probeert gegevens op te halen van waar dan ook buiten uw applicatie. Toevoegen proberen en vangst blokken:

 probeer  catch (Uitzondering e) tweetDisplay.setText ("Whoops - er is iets misgegaan!"); e.printStackTrace (); 

Als er een invoer- / uitvoerfout is, schrijven we eenvoudigweg een bericht naar de gebruikersinterface. Binnen in de proberen blok, maak een HTTP Get-object om het verzoek uit te voeren, door de zoek-URL door te geven:

 HttpGet tweetGet = nieuwe HttpGet (searchURL);

Nu kunnen we doorgaan en het verzoek uitvoeren, de resultaten opslaan in een HTTP-antwoordobject:

 HttpResponse tweetResponse = tweetClient.execute (tweetGet);

We kunnen het antwoordobject gebruiken om toegang te krijgen tot de inhoud en status van het reactiebericht dat van Twitter is ontvangen.


Stap 4: Verwerk de reactie

Voordat we het antwoordbericht proberen te verwerken, laten we de status controleren. Nog steeds binnen de proberen blok:

 StatusLine searchStatus = tweetResponse.getStatusLine ();

Als het antwoord OK is, kunnen we doorgaan en proberen de tweets te analyseren, anders zullen we een foutbericht naar de gebruiker sturen:

 if (searchStatus.getStatusCode () == 200)  else tweetDisplay.setText ("Whoops - er is iets misgegaan!");

Binnen in de als statement-blok, kunnen we nu de HTTP-entiteit en berichtinhoud ophalen als een invoerstroom:

 HttpEntity tweetEntity = tweetResponse.getEntity (); InputStream tweetContent = tweetEntity.getContent ();

Nu kunnen we de berichtinhoud beginnen toevoegen aan het programma, met behulp van een Input Stream Reader in plaats van een gebufferde Reader voor het beheren van de binnenkomende gegevens:

 InputStreamReader tweetInput = nieuwe InputStreamReader (tweetContent); BufferedReader tweetReader = new BufferedReader (tweetInput);

Laten we de gegevens regel voor regel lezen en elke regel toevoegen aan de String Builder die we hebben gemaakt:

 String lineIn; while ((lineIn = tweetReader.readLine ())! = null) tweetFeedBuilder.append (lineIn); 

Dit blijft toevoegen aan de String Builder totdat alle ontvangen gegevens zijn verwerkt. Ga nu naar de onderkant van de doInBackground methode, na de vangst block - retourneer de string waarin we de resultaten hebben omgezet in:

 return tweetFeedBuilder.toString ();

Dat is de doInBackground methode voltooid - het voert het ophalen van de tweet-feed uit en importeert deze in de app, dus nu kunnen we deze analyseren en weergeven.


Stap 5: analyseer de JSON Tweet Feed

Nu het AsyncTask de feed voor tweet heeft opgehaald, kunnen we het parseren en weergeven in onze gebruikersinterface. Om dit te doen kunnen we een andere methode van de AsyncTask-klasse implementeren, toegevoegd na doInBackground, nog steeds in de klasse-declaratie AsyncTask:

 protected void onPostExecute (String-resultaat) 

Merk op dat deze methode een stringparameter ontvangt, wat we hebben gespecificeerd als het derde type in de openingsklasse-declaratieregel en waar we van teruggekomen zijn doInBackground in de laatste stap. De tekenreeks is de JSON-tekst die de recente tweets op de zoekterm van de gebruiker weergeeft die is opgehaald via Twitter. We zullen deze tekst moeten analyseren om toegang te krijgen tot de inhoud van de tweets en deze in de gebruikersinterface weer te geven.

We zullen de tweet-tekst in een tekenreeks samenstellen om weer te geven, dus start de onPostExecute methode door een andere String Builder te maken:

 StringBuilder tweetResultBuilder = new StringBuilder ();

De JSON-verwerkingsmethoden kunnen uitzonderingen maken, dus toevoegen proberen en vangst blokkeert volgende:

 probeer  catch (Uitzondering e) tweetDisplay.setText ("Whoops - er is iets misgegaan!"); e.printStackTrace (); 

Je zou hier een patroon moeten opmerken - zoals bij elk programma waarin je probeert om externe gegevens op te halen en te verwerken, moet je goed letten op het omgaan met mogelijke fouten.

Binnen in de proberen blokkeren, een JSON-object maken en de JSON-tekenreeks doorgeven:

 JSONObject resultObject = nieuw JSONObject (resultaat);

Binnen in de JSON-tekststring bevindt zich een array met de tweets, plus enkele andere gegevens: voer een Twitter-zoekopdracht uit door de zoek-URL in de adresbalk van uw browser te plakken, zoals bijvoorbeeld de vorige keer:

 http://search.twitter.com/search.json?q=android

Mogelijk moet u de resulterende tekst kopiëren en in een teksteditor plakken om deze effectief te kunnen lezen. Als u door de JSON-tekst kijkt, ziet u de volgende sectie, die het begin van de tweet-array markeert:

 "Resultaten": [

We moeten deze tweet-array ophalen met behulp van de naam: "resultaten". Verkrijg de array "results" van het JSON-object:

 JSONArray tweetArray = resultObject.getJSONArray ("resultaten");

Nu kunnen we de tweets doorlopen en ze klaarmaken voor weergave.


Stap 6: Itereer de Tweet Array

Als u opnieuw kijkt naar de JSON-tekst die is opgehaald via de browser (of, optioneel, binnen Eclipse als u deze naar het Android-logboek schrijft terwijl u uw app uitvoert), kunt u de inhoud zien die voor elke tweet in de array wordt geretourneerd. In deze zelfstudie zullen we alleen de gebruikersnaam van de accounttweeting en de inhoud van de tweet zelf opschrijven. U kunt de app uitbreiden om de gewenste informatie op te nemen. In de tekst geretourneerd door Twitter, wordt de gebruikersnaam weergegeven als "from_user" en de inhoud van de tweet wordt "text" genoemd - kijk naar de JSON-inhoud om dit te verifiëren en om te zien welke andere gegevensitems zich daar bevinden.

In uw proberen blok, voeg na het ophalen van de tweet-array een toe voor lus om door de tweets te bladeren:

 voor (int t = 0; t 

Krijg in de loop elk item als een JSON-object:

 JSONObject tweetObject = tweetArray.getJSONObject (t);

Haal nu de gebruikersnaam van dit object op en voeg het toe aan de String Builder, samen met wat extra tekst voor weergavedoeleinden:

 tweetResultBuilder.append (tweetObject.getString ("from_user") + ":");

De klasse JSON-objecten biedt een getString methode voor dit doel; er is ook een alternatief krijgen methode. Haal nu de tweet-inhoud op en voeg deze toe:

 tweetResultBuilder.append (tweetObject.get ( "tekst") + "\ n \ n");

Stap 7: Geef de resultaten weer

Ga nu naar na de vangst blokkeren in de onPostExecute methode. Als de verwerking heeft gewerkt, wordt het resultaat weergegeven in de tekstweergave, anders wordt een foutbericht weergegeven:

 if (tweetResultBuilder.length ()> 0) tweetDisplay.setText (tweetResultBuilder.toString ()); else tweetDisplay.setText ("Sorry - geen tweets gevonden voor je zoekopdracht!");

Onze AsyncTask-cursus is nu voltooid.


Stap 8: Instantiëren en het AsyncTask uitvoeren

We hebben een AsyncTask om onze verwerking uit te voeren; we moeten er gewoon een beroep op doen. Ga terug naar je searchTwitter methode, binnen de proberen blokkeren en nadat we de tekenreeks voor de zoekopdracht hebben gemaakt. Maak een exemplaar van de nieuwe AsyncTask-klasse en bel de uitvoeren methode erop, waarbij de URL-string wordt doorgegeven:

 nieuwe GetTweets (). execute (searchURL);

Merk op dat we een string doorgeven, dat is wat we hebben gespecificeerd in de AsyncTask-verklaring en doInBackground methode.

Dat is de basisapp - u kunt hem testen in de emulator en op Android-apparaten. Probeer het met verschillende zoekopdrachten, zoals hashtags. Je kunt de app natuurlijk uitbreiden om meer informatie uit de tweets weer te geven en zelfs om te linken naar Twitter via klikken van gebruikers. Zoals de zaken er nu voorstaan, kan de gebruiker door de geretourneerde tweet-feed scrollen en herhaalde zoekopdrachten uitvoeren zoals zij willen.


Conclusie

In deze twee tutorials hebben we het ophalen van tweets uit de Twitter Search API onderzocht. U kunt dezelfde ontwerppatronen gebruiken om gegevens van andere webresources op te halen. Als uw apps complexere, doorlopende procedures voor het ophalen van gegevens gaan bevatten, wilt u mogelijk Content Providers en optioneel Services bekijken om de efficiëntie te maximaliseren. Zoals met alle op externe gegevens gebaseerde bewerkingen, kunt u er niet vanuit gaan dat het ophalen van de gewenste informatie succesvol is, dus een niveau van foutafhandeling is essentieel. De mogelijkheid om toegang te krijgen tot internetgegevens is natuurlijk een van de belangrijkste voordelen van mobiel computergebruik, dus deze technieken zijn een vitaal onderdeel van de toolbox van elke Android-ontwikkelaar..