Bygg en Twitter Search App Hent og tolk Twitter JSON Feed

Denne todelte opplæringsserien vil introdusere deg til grunnleggende for å jobbe med RESTful webtjenester ved hjelp av Android SDK. Underveis lærer du hvordan du utfører søk mot den offentlige Twitter-APIen!

I denne opplæringen bruker vi AsyncTask for å hente JSON-tweets, analysere dem og deretter vise dem i brukergrensesnittet. Selv om koden i denne opplæringen er spesifikk for Twitter, gjelder prinsippene for å hente mange andre web feeds og APIer ved hjelp av en RESTful arkitektur.

Denne opplæringsserien på Android Twitter Search er i to deler:

  • Del 1: Bygg søkeforespørselen
  • Del 2: Hent og tolk Twitter JSON Feed

Trinn 1: Lag en Inner AsyncTask Class

Vi skal bruke en AsyncTask for å utføre henting, analyse og visning av tweet-feed på brukernavnet. Ved å bruke AsyncTask kan vi skifte prosessering til en bakgrunnstråd, med resultatene fortsatt tilgjengelige for appens brukergrensesnitt for visning. I aktivitetsklassen legger du til en indre AsyncTask-klasse etter searchTwitter metode:

 Private Class GetTweets utvider AsyncTask 

AsyncTask-klassen er abstrakt, noe som betyr at du må opprette en underklasse for å kunne bruke den. Slike underklasser må implementere en bestemt metode som vi vil legge til neste. I mellomtiden vil Eclipse vise feilmeldinger (bare ignorere dem for nå).

AsyncTask bruker tre generiske typer som du kan se fra åpningslinjen til klassedeklarasjonen. Den første spesifiserer parameter type - i vårt tilfelle er dette en streng som vi skal passere URL-strengen vi opprettet. Den midtre typen er for fremdriftsenheter, som vi ikke skal bruke i denne opplæringen, så vi angir bare tomrom. Fremdriftsenheter kan brukes til å indikere fremdriften av bakgrunnsoppgaver. Den tredje typen er en annen streng, som bakgrunnsprosessen returnerer. I vårt tilfelle vil dette være den hentede JSON-feedteksten.


Trinn 2: Utfør bakgrunnsbehandling

I din AsyncTask-klasse legger du til følgende metode, som vi overstyrer fra foreldreklassen:

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

Parametertypen er streng, som matcher den første typen vi angav i åpningslinjen for klassedeklarasjon. Denne strengen skal være Twitter Search API-URLen vi bygde forrige gang. I denne metoden spesifiserer vi hvilken bakgrunnsprosess vi ønsker at AsyncTask skal utføre. Metoden returnerer også en verdi av typen streng, for å matche det vi angav som den tredje parameteren i åpningslinjen for klassedeklarasjon. Denne returnerte strengen vil bli mottatt som parameter til en annen metode, som vi vil implementere senere.

Tips: Hvis du ikke er kjent med abstrakte klasser eller generiske typer, ikke vær redd - det vi gjør her, følger egentlig bare et mønster. Som med mye av Android-plattformen, kan du lære hvordan du bruker disse ressursene fra eksemplene i utviklerveiledningen, og i dette tilfellet API-referansen.


Trinn 3: Send forespørselen

Twitter søkeresultatet kommer til å være en streng, som vi vil bygge ut fra svaret vi mottar. Inne i doInBackground metode, start med å lage en String Builder:

 StringBuilder tweetFeedBuilder = ny StringBuilder ();

Selv om vi bruker en enkelt nettadressestreng, kommer metoden til å motta en rekke objekter av den angitte typen (streng), så la oss gå gjennom det:

 for (streng søkURL: twitterURL) 

I virkeligheten vil sløyfen bare gjentas en gang, men du kan utvide koden din for å hente flere søkemater, så vi vil bruke en sløyfe for nå. Inne i løkken, opprett en HTTP-klient for å utføre forespørselen:

 HttpClient tweetClient = ny DefaultHttpClient ();

Nå må vi ta tak i I / O-unntak, slik det alltid er tilfelle når du prøver å hente data fra hvor som helst utenfor søknaden din. Legg til prøve og å fange blokker:

 prøv  fange (Unntak e) tweetDisplay.setText ("Whoops - noe gikk galt!"); e.printStackTrace (); 

Hvis det er en Input / Output-feil, skriver vi bare en melding til brukergrensesnittet. Inne i prøve blokkere, opprett et HTTP-objekt for å utføre forespørselen, ved å sende søkeadressen:

 HttpGet tweetGet = ny HttpGet (searchURL);

Nå kan vi gå videre og utføre forespørselen, lagre resultatene i et HTTP Response-objekt:

 HttpResponse tweetResponse = tweetClient.execute (tweetGet);

Vi vil kunne bruke responsobjektet for å få tilgang til innholdet og statusen til svarmeldingen mottatt fra Twitter.


Trinn 4: Behandle svaret

Før vi prøver å behandle svarmeldingen, la vi sjekke statusen. Fortsatt inne i prøve blokkere:

 StatusLine searchStatus = tweetResponse.getStatusLine ();

Hvis svaret er OK, kan vi fortsette og forsøke å analysere tweets, ellers vil vi sende en feilmelding til brukeren:

 hvis (searchStatus.getStatusCode () == 200)  annet tweetDisplay.setText ("Whoops - noe gikk galt!");

Inne i hvis setningsblokk, kan vi nå hente HTTP Entity og meldingsinnhold som en Input Stream:

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

Nå kan vi begynne å bringe meldingsinnholdet inn i programmet, ved hjelp av en Input Stream Reader, snarere enn en Buffered Reader for å administrere innkommende data:

 InputStreamReader tweetInput = ny InputStreamReader (tweetContent); BufferedReader tweetReader = ny BufferedReader (tweetInput);

La oss lese i dataene en linje om gangen, og legge hver linje til String Builder vi opprettet:

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

Dette vil fortsette å legge til String Builder til alle mottatte dataene er behandlet. Flytt nå til bunnen av doInBackground metode, etter å fange blokk - returner strengen vi har bygget resultatene inn i:

 returnere tweetFeedBuilder.toString ();

Det er doInBackground metode fullført - den utfører henting av tweet feed og importerer den til appen, så nå kan vi analysere og vise den.


Trinn 5: Analysér JSON Tweet Feed

Nå som AsyncTask har hentet tweet-feedet, kan vi analysere det og vise det i brukerprogrammets brukergrensesnitt. For å gjøre dette kan vi implementere en annen metode i AsyncTask-klassen, lagt til etter doInBackground, Fortsatt inne i AsyncTask-klassedeklarasjonen:

 beskyttet ugyldig onPostExecute (strengresultat) 

Legg merke til at denne metoden mottar en strengparameter, som er det vi angav som den tredje typen i åpningsklassens deklarasjonslinje og hva vi returnerte fra doInBackground i det siste trinnet. Strengen er JSON-teksten som representerer de siste tweets på brukerens søkeord hentet fra Twitter. Vi må analysere denne teksten for å få tilgang til innholdet i tweets og vise dem i brukergrensesnittet.

Vi skal bygge tweetteksten i en streng for visning, så start den onPostExecute Metode ved å opprette en annen String Builder:

 StringBuilder tweetResultBuilder = ny StringBuilder ();

JSON-behandlingsmetodene kan kaste unntak, så legg til prøve og å fange blokkerer neste:

 prøv  fange (Unntak e) tweetDisplay.setText ("Whoops - noe gikk galt!"); e.printStackTrace (); 

Du bør merke et mønster her - som med ethvert program der du prøver å hente og behandle eksterne data, må du være forsiktig med å håndtere potensielle feil.

Inne i prøve blokkere, opprett et JSON-objekt, passerer JSON-tekststrengen:

 JSONObject resultObject = nytt JSONObject (result);

Inne i JSON-tekststrengen er en matrise som inneholder tweets, pluss noen andre data - utfør en Twitter-spørring ved å lime inn søkeadressen i nettleserens adresselinje som vi gjorde sist, for eksempel:

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

Du må kanskje kopiere og lime inn den resulterende teksten i en tekstredigerer for å lese den effektivt. Hvis du ser gjennom JSON-teksten, vil du se følgende avsnitt, som markerer begynnelsen på tweet-arrayen:

 "resultater": [

Vi må hente denne tweet-arrayen ved å bruke navnet: "results". Få "resultater" -arrangementet fra JSON-objektet:

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

Nå kan vi løse gjennom tweets og forberede dem til visning.


Trinn 6: Iterate Tweet Array

Hvis du ser igjen på JSON-teksten hentet gjennom nettleseren (eller, eventuelt, innenfor Eclipse hvis du skriver den til Android-loggen mens du kjører appen din), kan du se innholdet som returneres for hver tweet i arrayet. I denne veiledningen vil vi kun skrive ut brukernavnet til konto tweeting og innholdet i tweetet selv. Du kan utvide appen til å inkludere hvilken som helst informasjon du vil ha. I teksten som er returnert fra Twitter, er brukernavnet representert som "from_user" og tweetinnholdet heter "tekst" - se på JSON-innholdet for å bekrefte dette og se hvilke andre dataelementer som er der.

I din prøve blokkere, etter å ha hentet tweet array, legg til en til loop for å iterere gjennom tweets:

 for (int t = 0; t 

Inne i løkken, få hvert element som et JSON-objekt:

 JSONObject tweetObject = tweetArray.getJSONObject (t);

Hent nå brukernavnet fra dette objektet, legg det til String Builder sammen med litt ekstra tekst for visningsformål:

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

JSON Objekt-klassen gir en getString metode for dette formålet; det er også et alternativ metode. Hent og legg til tweetinnholdet nå:

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

Trinn 7: Vis resultatene

Nå flytte til etter å fange blokkere inne i onPostExecute metode. Hvis behandlingen har fungert, viser vi resultatet i tekstvisningen, ellers viser vi en feilmelding:

 hvis (tweetResultBuilder.length ()> 0) tweetDisplay.setText (tweetResultBuilder.toString ()); ellers tweetDisplay.setText ("Beklager - ingen tweets funnet for søket ditt!");

Vår AsyncTask-klasse er nå ferdig.


Trinn 8: Instantiate & Execute AsyncTask

Vi har en AsyncTask for å utføre behandlingen vår; vi trenger bare å ringe på den. Flytt tilbake til din searchTwitter metode, inne i prøve blokkere og etter at vi har bygget søkeordet URL-streng. Opprett en forekomst av den nye AsyncTask-klassen og ring til henrette metode på den, passerer URL-strengen:

 nye GetTweets (). kjøre (searchURL);

Legg merke til at vi sender en streng, som vi har oppgitt i AsyncTask-deklarasjonen og doInBackground metode.

Det er den grunnleggende appen komplett - du kan teste den i emulatoren og på Android-enheter. Prøv det med forskjellige søk, for eksempel hashtags. Du kan selvfølgelig utvide appen til å vise mer informasjon fra tweets og til og med å koble til Twitter på brukerklikk. Som ting står kan brukeren bla gjennom den returnerte tweet-feeden og utføre gjentatte søk etter ønske.


Konklusjon

I disse to opplæringsprogrammene har vi undersøkt å hente tweets fra Twitter Search API. Du kan bruke de samme designmønstrene for å hente data fra andre webressurser. Hvis appene dine skal involvere mer komplekse, pågående datainnhentingsprosesser, kan du kanskje se innholdsleverandører og valgfritt tjenester for å maksimere effektiviteten. Som med alle eksterne data-baserte operasjoner, kan du ikke anta at henting av informasjonen du trenger vil lykkes, så et nivå på feilhåndtering er viktig. Muligheten til å få tilgang til Internett-data er selvsagt en av de viktigste fordelene med mobil databehandling, slik at disse teknikkene er en viktig komponent i enhver Android-utviklerens verktøykasse.