Crea un'app di ricerca Twitter recupera e analizza il feed JSON di Twitter

Questa serie di tutorial in due parti ti introdurrà ai fondamenti di lavorare con i servizi web RESTful utilizzando l'SDK di Android. Lungo la strada, imparerai come eseguire ricerche contro l'API pubblica di Twitter!

In questo tutorial useremo AsyncTask per recuperare i tweet JSON, analizzarli, quindi visualizzarli nell'interfaccia utente. Sebbene il codice in questo tutorial sia specifico di Twitter, i principi in questione si applicano al recupero di molti altri feed e API Web utilizzando un'architettura RESTful.

Questa serie di tutorial su Android Twitter Search si divide in due parti:

  • Parte 1: crea la richiesta di ricerca
  • Parte 2: recupera e analizza il feed JSON di Twitter

Passaggio 1: creare una classe AsyncTask interna

Useremo un AsyncTask per eseguire il recupero, l'analisi e la visualizzazione del feed tweet sulla query di ricerca dell'utente. Usando AsyncTask, possiamo spostare l'elaborazione in un thread in background, con i risultati ancora accessibili all'interfaccia utente dell'app per la visualizzazione. Nella classe Activity, aggiungi una classe AsyncTask interna dopo searchTwitter metodo:

 la classe privata GetTweets estende AsyncTask 

La classe AsyncTask è astratta, il che significa che devi creare una sottoclasse per poterla usare. Tali sottoclassi devono implementare un metodo particolare che aggiungeremo in seguito. Nel frattempo, Eclipse visualizzerà i messaggi di errore (ignorali per ora).

AsyncTask utilizza tre tipi generici, come puoi vedere dalla riga di apertura della dichiarazione di classe. Il primo specifica il tipo di parametro - nel nostro caso questa è una stringa dato che stiamo per passare la stringa URL che abbiamo creato. Il tipo medio è per le unità di progresso, che non useremo in questo tutorial, quindi specificiamo semplicemente void. Le unità di progresso possono essere utilizzate per indicare lo stato di avanzamento delle attività in background. Il terzo tipo è un'altra stringa, che restituisce il processo in background. Nel nostro caso questo sarà il testo del feed JSON recuperato.


Passaggio 2: eseguire l'elaborazione in background

All'interno della tua classe AsyncTask, aggiungi il seguente metodo, che sostituiamo dalla classe genitore:

 @Override protetto da stringa DoInBackground (String ... twitterURL) 

Il tipo di parametro è string, corrispondente al primo tipo indicato nella riga di apertura della dichiarazione di classe. Questa stringa sarà l'URL dell'API di ricerca di Twitter che abbiamo creato l'ultima volta. All'interno di questo metodo, specifichiamo quale processo in background vogliamo che AsyncTask esegua. Il metodo restituisce anche un valore di tipo stringa, in modo che corrisponda a ciò che abbiamo specificato come terzo parametro nella riga di apertura della dichiarazione di classe. Questa stringa restituita verrà ricevuta come parametro per un secondo metodo, che implementeremo in seguito.

Mancia: Se non hai familiarità con classi astratte o tipi generici, non ti preoccupare - quello che stiamo facendo qui è in realtà solo seguendo uno schema. Come con gran parte della piattaforma Android, puoi imparare come utilizzare queste risorse dagli esempi nella Guida per gli sviluppatori e, in questo caso, il riferimento dell'API.


Passaggio 3: invia la richiesta

Il risultato della ricerca su Twitter sarà una stringa, che costruiremo dalla risposta che riceveremo. Dentro il doInBackground metodo, inizia creando un generatore di stringhe:

 StringBuilder tweetFeedBuilder = new StringBuilder ();

Sebbene usiamo una singola stringa di URL, il metodo riceverà una matrice di oggetti del tipo specificato (stringa), quindi analizziamola:

 for (String searchURL: twitterURL) 

In realtà, il ciclo eseguirà solo una volta l'iterazione, ma potresti estendere il codice per recuperare più feed di ricerca, quindi per il momento utilizzeremo un ciclo. All'interno del ciclo, creare un client HTTP per l'esecuzione della richiesta:

 HttpClient tweetClient = new DefaultHttpClient ();

Ora dobbiamo catturare le eccezioni I / O, come avviene invariabilmente quando si tenta di recuperare i dati da qualsiasi luogo al di fuori dell'applicazione. Inserisci provare e catturare blocchi:

 prova  catch (Exception e) tweetDisplay.setText ("Whoops - qualcosa è andato storto!"); e.printStackTrace (); 

Se c'è un errore di input / output, semplicemente scriviamo un messaggio all'interfaccia utente. Dentro il provare bloccare, creare un oggetto Get HTTP per emettere la richiesta, passando l'URL di ricerca:

 HttpGet tweetGet = new HttpGet (searchURL);

Ora possiamo andare avanti ed eseguire la richiesta, memorizzando i risultati in un oggetto HTTP Response:

 HttpResponse tweetResponse = tweetClient.execute (tweetGet);

Saremo in grado di utilizzare l'oggetto risposta per accedere al contenuto e allo stato del messaggio di risposta ricevuto da Twitter.


Passaggio 4: elaborare la risposta

Prima di tentare di elaborare il messaggio di risposta, controlliamo lo stato. Ancora dentro il provare bloccare:

 StatusLine searchStatus = tweetResponse.getStatusLine ();

Se la risposta è OK, possiamo continuare e tentare di analizzare i tweet, altrimenti manderemo un messaggio di errore all'utente:

 if (searchStatus.getStatusCode () == 200)  else tweetDisplay.setText ("Whoops - qualcosa è andato storto!");

Dentro il Se blocco di istruzioni, ora possiamo recuperare l'entità HTTP e il contenuto del messaggio come un flusso di input:

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

Ora possiamo iniziare a portare il contenuto del messaggio nel programma, utilizzando un lettore di flussi di input anziché un lettore bufferizzato per la gestione dei dati in arrivo:

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

Leggiamo i dati una riga alla volta, aggiungendo ogni riga al generatore di stringhe che abbiamo creato:

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

Questo continuerà ad aggiungere al generatore di stringhe fino a quando tutti i dati ricevuti non saranno stati elaborati. Ora vai al fondo del doInBackground metodo, dopo il catturare block - restituisce la stringa in cui sono stati costruiti i risultati in:

 return tweetFeedBuilder.toString ();

Quello è il doInBackground metodo completo - esegue il recupero del feed tweet e lo importa nell'app, quindi ora possiamo analizzarlo e visualizzarlo.


Passaggio 5: Analizza il feed Tweet JSON

Ora che AsyncTask ha recuperato il feed tweet, possiamo analizzarlo e visualizzarlo nell'interfaccia utente dell'applicazione. Per fare questo possiamo implementare un altro metodo della classe AsyncTask, aggiunto dopo doInBackground, ancora all'interno della dichiarazione della classe AsyncTask:

 protected void onPostExecute (String result) 

Si noti che questo metodo riceve un parametro stringa, che è quello che abbiamo specificato come terzo tipo nella riga di dichiarazione della classe di apertura e da cosa è stato restituito doInBackground nell'ultimo passaggio. La stringa è il testo JSON che rappresenta i tweet recenti sul termine di ricerca dell'utente recuperato da Twitter. Avremo bisogno di analizzare questo testo per accedere al contenuto dei tweet e visualizzarli nell'interfaccia utente.

Costruiremo il testo del tweet in una stringa per la visualizzazione, quindi avvia OnPostExecute metodo creando un altro generatore di stringhe:

 StringBuilder tweetResultBuilder = new StringBuilder ();

I metodi di elaborazione JSON possono generare eccezioni, quindi aggiungere provare e catturare blocchi successivi:

 prova  catch (Exception e) tweetDisplay.setText ("Whoops - qualcosa è andato storto!"); e.printStackTrace (); 

Dovresti notare uno schema qui: come con qualsiasi programma in cui tenti di recuperare ed elaborare dati esterni, devi prestare molta attenzione alla gestione di potenziali errori.

Dentro il provare bloccare, creare un oggetto JSON, passando la stringa di testo JSON:

 JSONObject resultObject = new JSONObject (result);

All'interno della stringa di testo JSON c'è una matrice contenente i tweet, oltre ad altri dati: eseguire una query di Twitter incollando l'URL di ricerca nella barra degli indirizzi del browser come abbiamo fatto l'ultima volta, ad esempio:

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

Potrebbe essere necessario copiare e incollare il testo risultante in un editor di testo per leggerlo in modo efficace. Se guardi il testo JSON, vedrai la seguente sezione, che segna l'inizio dell'array tweet:

 "risultati": [

Abbiamo bisogno di recuperare questo array di tweet, usando il suo nome: "risultati". Ottieni la matrice "risultati" dall'oggetto JSON:

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

Ora possiamo scorrere i tweet e prepararli per la visualizzazione.


Passaggio 6: Iterare la matrice di Tweet

Se si guarda ancora il testo JSON recuperato tramite il browser (o, facoltativamente, all'interno di Eclipse se lo si scrive nel log di Android durante l'esecuzione dell'app), è possibile vedere il contenuto restituito per ciascun tweet nell'array. In questo tutorial scriveremo solo il nome utente del tweeting dell'account e il contenuto del tweet stesso. Puoi estendere l'app per includere tutte le informazioni che desideri. Nel testo restituito da Twitter, il nome utente è rappresentato come "from_user" e il contenuto del tweet è denominato "testo": guarda il contenuto JSON per verificarlo e per vedere quali altri elementi di dati ci sono.

Nel tuo provare bloccare, dopo aver recuperato l'array di tweet, aggiungere un per loop per scorrere i tweet:

 per (int t = 0; t 

All'interno del ciclo, ottieni ciascun elemento come oggetto JSON:

 JSONObject tweetObject = tweetArray.getJSONObject (t);

Ora recupera il nome utente da questo oggetto, aggiungendolo al generatore di stringhe insieme a del testo aggiuntivo per la visualizzazione:

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

La classe Object JSON fornisce a getString metodo per questo scopo; c'è anche un'alternativa ottenere metodo. Ora recupera e aggiungi il contenuto dei tweet:

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

Passaggio 7: Visualizza i risultati

Ora spostati dopo il catturare bloccare dentro il OnPostExecute metodo. Se l'elaborazione ha funzionato, visualizziamo il risultato nella vista testo, altrimenti viene visualizzato un messaggio di errore:

 if (tweetResultBuilder.length ()> 0) tweetDisplay.setText (tweetResultBuilder.toString ()); else tweetDisplay.setText ("Scusa - nessun tweet trovato per la tua ricerca!");

La nostra classe AsyncTask è ora completa.


Passaggio 8: Istanziare ed eseguire AsyncTask

Abbiamo un AsyncTask per eseguire la nostra elaborazione; dobbiamo solo chiamarci. Torna al tuo searchTwitter metodo, dentro il provare bloccare e dopo aver creato la stringa dell'URL della query di ricerca. Creare un'istanza della nuova classe AsyncTask e chiamare il eseguire metodo su di esso, passando la stringa dell'URL:

 nuovo GetTweets (). execute (searchURL);

Si noti che passiamo una stringa, che è ciò che abbiamo specificato nella dichiarazione AsyncTask e doInBackground metodo.

Questa è l'app di base completa: puoi testarla nell'emulatore e sui dispositivi Android. Provalo con diverse query di ricerca come gli hashtag. Ovviamente è possibile estendere l'app per visualizzare maggiori informazioni dai tweet e persino per collegarsi a Twitter sui clic dell'utente. Allo stato attuale, l'utente può scorrere il feed dei tweet restituiti ed effettuare ricerche ripetute come desiderano.


Conclusione

In questi due tutorial abbiamo esplorato il recupero dei tweet dall'API di ricerca di Twitter. È possibile utilizzare gli stessi modelli di progettazione per recuperare i dati da altre risorse Web. Se le tue app coinvolgeranno processi di recupero dei dati più complessi e in corso, potresti voler esaminare i fornitori di contenuti e, facoltativamente, i Servizi per massimizzare l'efficienza. Come con qualsiasi operazione esterna basata sui dati, non si può presumere che il recupero delle informazioni necessarie abbia esito positivo, quindi un livello di gestione degli errori è essenziale. La possibilità di accedere ai dati di Internet è ovviamente uno dei principali vantaggi del mobile computing, quindi queste tecniche sono un componente vitale in qualsiasi toolbox per sviluppatori Android.