Construire une application de recherche Twitter récupérer et analyser le flux JSON de Twitter

Cette série de didacticiels en deux parties présente les principes de base de l'utilisation de services Web RESTful à l'aide du SDK Android. En cours de route, vous apprendrez comment effectuer des recherches sur l'API publique de Twitter.!

Dans ce didacticiel, nous allons utiliser AsyncTask pour récupérer les tweets JSON, les analyser, puis les afficher dans l'interface utilisateur. Bien que le code de ce didacticiel soit spécifique à Twitter, les principes impliqués s'appliquent à la récupération de nombreux autres flux Web et API à l'aide d'une architecture RESTful..

Cette série de tutoriels sur Android Twitter Search se compose de deux parties:

  • Partie 1: Construire la demande de recherche
  • Partie 2: Récupérer et analyser le flux JSON de Twitter

Étape 1: Créer une classe AsyncTask interne

Nous allons utiliser une AsyncTask pour effectuer la récupération, l'analyse et l'affichage du flux de tweet sur la requête de recherche de l'utilisateur. En utilisant AsyncTask, nous pouvons déplacer le traitement dans un thread en arrière-plan, avec les résultats toujours accessibles à l'interface utilisateur de l'application pour affichage. Dans votre classe d’activité, ajoutez une classe interne AsyncTask après la searchTwitter méthode:

 classe privée GetTweets étend AsyncTask 

La classe AsyncTask est abstraite, ce qui signifie que vous devez créer une sous-classe pour pouvoir l'utiliser. Ces sous-classes doivent implémenter une méthode particulière que nous ajouterons ensuite. En attendant, Eclipse affichera des messages d'erreur (ne les ignorez pas pour l'instant).

AsyncTask utilise trois types génériques, comme vous pouvez le voir à partir de la ligne d'ouverture de la déclaration de classe. La première spécifie le type de paramètre - dans notre cas, il s'agit d'une chaîne car nous allons transmettre la chaîne d'URL créée. Le type du milieu est pour les unités de progression, ce que nous n'utiliserons pas dans ce tutoriel, nous spécifions simplement vide. Les unités de progression peuvent être utilisées pour indiquer la progression des tâches en arrière-plan. Le troisième type est une autre chaîne, que le processus d'arrière-plan renvoie. Dans notre cas, cela va être le texte de flux JSON récupéré.


Étape 2: Effectuer un traitement en arrière-plan

Dans votre classe AsyncTask, ajoutez la méthode suivante, que nous substituons à la classe parent:

 @Override protected String doInBackground (String… twitterURL) 

Le type de paramètre est string, correspondant au premier type indiqué dans la ligne d'ouverture de la déclaration de classe. Cette chaîne sera l'URL de l'API de recherche Twitter que nous avons créée la dernière fois. Dans cette méthode, nous spécifions le processus d'arrière-plan que nous voulons que l'AsyncTask exécute. La méthode renvoie également une valeur de type chaîne, pour correspondre à ce que nous avons spécifié comme troisième paramètre de la ligne d'ouverture de la déclaration de classe. Cette chaîne retournée sera reçue comme paramètre d'une seconde méthode, que nous implémenterons plus tard.

Pointe: Si vous n'êtes pas familier avec les classes abstraites ou les types génériques, ne vous inquiétez pas - ce que nous faisons ici ne fait que suivre un modèle. Comme avec une grande partie de la plate-forme Android, vous pouvez apprendre à utiliser ces ressources à partir des exemples du Guide du développeur et, dans ce cas, de la référence de l'API..


Étape 3: envoyer la demande

Le résultat de la recherche sur Twitter sera une chaîne que nous construirons à partir de la réponse reçue. À l'intérieur de doInBackground méthode, commencez par créer un constructeur de chaînes:

 StringBuilder tweetFeedBuilder = new StringBuilder ();

Bien que nous utilisions une seule chaîne d'URL, la méthode va recevoir un tableau d'objets du type spécifié (chaîne), alors parcourons-la en boucle:

 pour (String searchURL: twitterURL) 

En réalité, la boucle n'itère qu'une seule fois, mais vous pouvez étendre votre code pour extraire plusieurs flux de recherche. Nous allons donc utiliser une boucle pour le moment. Dans la boucle, créez un client HTTP pour exécuter la demande:

 HttpClient tweetClient = new DefaultHttpClient ();

Nous devons maintenant intercepter les exceptions d'E / S, comme c'est invariablement le cas lorsque vous essayez d'extraire des données n'importe où en dehors de votre application. Ajouter essayer et capture blocs:

 try  catch (Exception e) tweetDisplay.setText ("Whoops - Une erreur s'est produite!"); e.printStackTrace (); 

S'il y a une erreur d'entrée / sortie, nous écrivons simplement un message à l'interface utilisateur. À l'intérieur de essayer bloquer, créer un objet HTTP Get pour émettre la demande, en passant l'URL de recherche:

 HttpGet tweetGet = new HttpGet (searchURL);

Maintenant, nous pouvons aller de l'avant et exécuter la demande, en stockant les résultats dans un objet de réponse HTTP:

 HttpResponse tweetResponse = tweetClient.execute (tweetGet);

Nous pourrons utiliser l'objet de réponse pour accéder au contenu et à l'état du message de réponse reçu de Twitter..


Étape 4: Traiter la réponse

Avant de tenter de traiter le message de réponse, vérifions l'état. Toujours dans le essayer bloc:

 StatusLine searchStatus = tweetResponse.getStatusLine ();

Si la réponse est OK, nous pouvons poursuivre et tenter d'analyser les tweets. Sinon, nous enverrons un message d'erreur à l'utilisateur:

 if (searchStatus.getStatusCode () == 200)  else tweetDisplay.setText ("Whoops - quelque chose s'est mal passé!");

À l'intérieur de si bloc d'instructions, nous pouvons maintenant récupérer l'entité HTTP et le contenu du message sous forme de flux d'entrée:

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

Nous pouvons maintenant commencer à importer le contenu du message dans le programme, en utilisant un lecteur de flux d'entrée plutôt qu'un lecteur à mémoire tampon pour gérer les données entrantes:

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

Lisons les données ligne par ligne en ajoutant chaque ligne au constructeur de chaînes que nous avons créé:

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

Cela continuera à être ajouté au Générateur de chaînes jusqu'à ce que toutes les données reçues aient été traitées. Passons maintenant au bas de la doInBackground méthode, après le capture block - retourne la chaîne dans laquelle nous avons construit les résultats:

 renvoyer tweetFeedBuilder.toString ();

C'est le doInBackground méthode complete - elle récupère le contenu du tweet et l'importe dans l'application, afin que nous puissions maintenant l'analyser et l'afficher.


Étape 5: Analyser le flux JSON Tweet

Maintenant que AsyncTask a récupéré le flux de tweet, nous pouvons l'analyser et l'afficher dans notre interface utilisateur d'application. Pour ce faire, nous pouvons implémenter une autre méthode de la classe AsyncTask, ajoutée après doInBackground, toujours dans la déclaration de classe AsyncTask:

 void protégé onPostExecute (Résultat de la chaîne) 

Notez que cette méthode reçoit un paramètre de chaîne, qui est ce que nous avons spécifié comme troisième type dans la ligne de déclaration de la classe d'ouverture et ce que nous avons renvoyé. doInBackground dans la dernière étape. La chaîne est le texte JSON représentant les tweets récents du terme de recherche d'utilisateur extrait de Twitter. Nous devrons analyser ce texte pour accéder au contenu des tweets et les afficher dans l'interface utilisateur..

Nous allons construire le texte du tweet dans une chaîne pour l'affichage, alors démarrez le onPostExecute méthode en créant un autre constructeur de chaînes:

 StringBuilder tweetResultBuilder = new StringBuilder ();

Les méthodes de traitement JSON peuvent générer des exceptions, ajoutez donc essayer et capture bloque ensuite:

 try  catch (Exception e) tweetDisplay.setText ("Whoops - Une erreur s'est produite!"); e.printStackTrace (); 

Vous devriez remarquer une tendance ici - comme pour tout programme dans lequel vous essayez de récupérer et de traiter des données externes, vous devez faire très attention à la gestion des erreurs potentielles..

À l'intérieur de essayer bloquer, créer un objet JSON en passant la chaîne de texte JSON:

 JSONObject resultObject = new JSONObject (result);

Dans la chaîne de texte JSON se trouve un tableau contenant les tweets, ainsi que d'autres données - exécutez une requête Twitter en collant l'URL de recherche dans la barre d'adresse de votre navigateur, comme nous l'avons fait la dernière fois, par exemple:

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

Vous devrez peut-être copier et coller le texte obtenu dans un éditeur de texte pour le lire efficacement. Si vous parcourez le texte JSON, vous verrez la section suivante, qui marque le début du tableau tweet:

 "résultats":[

Nous devons récupérer ce tableau tweet, en utilisant son nom: "results". Obtenez le tableau "results" à partir de l'objet JSON:

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

Nous pouvons maintenant parcourir les tweets et les préparer pour l'affichage.


Étape 6: Itérer le tableau de Tweet

Si vous examinez à nouveau le texte JSON récupéré via le navigateur (ou éventuellement dans Eclipse si vous l'écrivez dans le journal Android lors de l'exécution de votre application), vous pouvez voir le contenu renvoyé pour chaque tweet du tableau. Dans ce tutoriel, nous n'écrirons que le nom d'utilisateur du compte tweeting et le contenu du tweet lui-même. Vous pouvez étendre l'application pour inclure les informations souhaitées. Dans le texte renvoyé par Twitter, le nom d'utilisateur est représenté par "from_user" et le contenu du tweet s'appelle "text" - consultez le contenu JSON pour vérifier cela et voir les autres éléments de données qu'il contient..

Dans ton essayer block, après avoir récupéré le tableau tweet, ajoutez un pour boucle pour parcourir les tweets:

 pour (int t = 0; t 

Dans la boucle, obtenez chaque élément sous forme d'objet JSON:

 JSONObject tweetObject = tweetArray.getJSONObject (t);

Maintenant, récupérez le nom d'utilisateur de cet objet, en l'ajoutant au constructeur de chaînes avec du texte supplémentaire à des fins d'affichage:

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

La classe d'objets JSON fournit une getString méthode à cette fin; il y a aussi une alternative obtenir méthode. Maintenant, récupérez et ajoutez le contenu du tweet:

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

Étape 7: Afficher les résultats

Passons maintenant à après le capture bloquer à l'intérieur du onPostExecute méthode. Si le traitement a fonctionné, nous affichons le résultat dans la vue texte. Sinon, nous affichons un message d'erreur:

 if (tweetResultBuilder.length ()> 0) tweetDisplay.setText (tweetResultBuilder.toString ()); else tweetDisplay.setText ("Désolé - aucun tweets trouvé pour votre recherche!");

Notre classe AsyncTask est maintenant terminée.


Étape 8: Instanciez et exécutez la tâche asynchrone

Nous avons un AsyncTask pour effectuer notre traitement; nous avons juste besoin d'y faire appel. Revenez à votre searchTwitter méthode, à l'intérieur du essayer bloquer et ensuite nous avons construit la chaîne URL de requête de recherche. Créez une instance de la nouvelle classe AsyncTask et appelez le exécuter méthode dessus, en passant la chaîne d'URL:

 new GetTweets (). execute (searchURL);

Notez que nous passons une chaîne, qui est ce que nous avons spécifié dans la déclaration AsyncTask et doInBackground méthode.

C'est l'application de base complète - vous pouvez la tester dans l'émulateur et sur les appareils Android. Essayez-le avec différentes requêtes de recherche telles que les hashtags. Vous pouvez bien sûr étendre l'application pour afficher davantage d'informations issues des tweets et même pour vous connecter à Twitter lors de clics d'utilisateurs. En l'état actuel des choses, l'utilisateur peut faire défiler le flux de tweet renvoyé et effectuer des recherches répétées à sa guise..


Conclusion

Dans ces deux tutoriels, nous avons exploré extraire des tweets à partir de l'API de recherche Twitter. Vous pouvez utiliser les mêmes modèles de conception pour extraire des données d'autres ressources Web. Si vos applications impliquent des processus de récupération de données plus complexes et en cours, vous souhaiterez peut-être consulter les fournisseurs de contenu et, éventuellement, les services pour optimiser l'efficacité. Comme pour toutes les opérations basées sur des données externes, vous ne pouvez pas supposer que la récupération des informations dont vous avez besoin réussira. Un niveau de traitement des erreurs est donc essentiel. La possibilité d'accéder aux données Internet est bien sûr l'un des avantages clés de l'informatique mobile. Ces techniques sont donc un élément essentiel de la boîte à outils de tout développeur Android..