Menu

Main Menu

  • Categories not found.

logo

Menu

  • Categories not found.
développement Android
Principal › développement Android › Construire un simple lecteur RSS - tutoriel complet avec code

Construire un simple lecteur RSS - tutoriel complet avec code

Cette application permettrait de récupérer les flux RSS à partir d'une seule adresse Internet spécifiée par l'utilisateur et d'afficher le contenu à l'aide d'une vue recyclée. Si vous n'êtes pas familier avec le widget RecyclerView, consultez notre précédent didacticiel sur l'utilisation de RecyclerView.

RSS, ou Rich Site Summary, constitue un moyen simple et efficace de partager des extraits de recherche d'informations fréquemment mises à jour sous forme d'entrées de blog ou d'articles d'actualités avec des abonnés. Aujourd'hui, presque tous les sites d'informations disposent d'un flux RSS accessible via votre navigateur préféré. Pour le flux RSS contient généralement un résumé du nouveau contenu, plutôt que l'article entier de nouvelles (ou blog). Pour répondre à votre question, oui, Android Authority dispose d'un flux RSS, disponible à l'adresse http://feed.androidauthority.com/, et vous devez vous abonner, si ce n'est déjà fait. : D

Exemple de flux RSS

Un flux RSS est un document en texte brut, formaté en XML. En tant que XML, il est relativement facile à lire pour les humains, et donc pas difficile pour les programmes à analyser. Un exemple de document XML est présenté ci-dessous.

 Titre RSS Ceci est un exemple de flux RSS //www.example.com/main.html lun, 06 sept. 2010 00:01:00 +0000 dim, 06 sept. 2009 16:20:00 +0000 1800 Exemple de saisie Voici: du texte contenant une description intéressante. //www.example.com/blog/post/1 7bd204c6-1655-4c27-aeee-53f933c5395f dim, 06 sept. 2009 16:20:00 +0000 Deuxième exemple d'entrée Autre texte contenant une description encore plus intéressante. //www.exemple.com/blog/post/2 7a4a56b6-1655-4c27-aeee-33e4453f2675 dim, 06 sept. 2009 18:14:00 +0000 

Nous pouvons voir à partir de l'exemple ci-dessus que le fil a un titre, une description, un lien, la date de dernière construction, une date de publication et une heure pour vivre. Pour ce tutoriel, nous ne nous intéressons qu'au titre, à la description et au lien.

Il y a donc deux éléments dans le flux, chacun ayant un titre, une description et un lien, ainsi qu’un guid (identifiant unique global) et une date de publication. Flux RSS, nous ne nous intéressons qu'au titre, à la description et au lien.

Préparer le projet

Bien sûr, la première chose à faire est de créer un nouveau projet Android Studio avec une activité vide, que nous venons de nommer SimpleRSSReader. Dans le fichier AndroidManifiest.xml, nous incluons l'autorisation INTERNET. Puisque le lecteur rss veut se nourrir d’Internet, nous devons déclarer cette permission.

Nous avons donc l'intention d'utiliser la bibliothèque de support, RecyclerView et la bibliothèque de support de conception, nous les ajoutons donc à notre fichier build.gradle. La version la plus récente de la publication est le 25.0.1.

 compiler 'com.android.support:appcompat-v7:25.0.1' compiler 'com.android.support:recyclerview-v7:25.0.1' compiler 'com.android.support:design:25.0.1' 

Grand. Une fois la configuration initiale terminée, mettons-nous au travail.

Concevoir la mise en page

Notre application de lecteur RSS veut récupérer le flux et afficher les éléments de flux dans une vue de recyclage.

Avez-vous remarqué que nous avons inclus notre liste de recyclage dans un SwipeRefreshLayout? SwipeRefreshLayout est une bibliothèque de support de conception.

Création de MainActivity

Dans la classe MainActivity, la première chose à faire est de définir les propriétés EditText, Button, RecyclerView et SwipeLayout. Nous avons donc configuré un écouteur de clic pour le bouton, puis sur OnRefreshListener pour SwipeRefreshLayout.

 Classe publique MainActivity étend AppCompatActivity {privé RecyclerView mRecyclerView; private EditText mEditText; bouton privé mFetchFeedButton; Private SwipeRefreshLayout mSwipeLayout; TextView privé mFeedTitleTextView; TextView privé mFeedLinkTextView; TextView privé mFeedDescriptionTextView; liste privée mFeedModelList; chaîne privée mFeedTitle; chaîne privée mFeedLink; chaîne privée mFeedDescription; @Override protected void onCreate (ensemble, savedInstanceState) {super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); mRecyclerView = (RecyclerView) findViewById (R.id.recyclerView); mEditText = (EditText) findViewById (R.id.rssFeedEditText); mFetchFeedButton = (bouton) findViewById (R.id.fetchFeedButton); mSwipeLayout = (SwipeRefreshLayout) findViewById (R.id.swipeRefreshLayout); mFeedTitleTextView = (TextView) findViewById (R.id.feedTitle); mFeedDescriptionTextView = (TextView) findViewById (R.id.feedDescription); mFeedLinkTextView = (TextView) findViewById (R.id.feedLink); mRecyclerView.setLayoutManager (new LinearLayoutManager (this)); mFetchFeedButton.setOnClickListener (nouvelle View.OnClickListener () {@Override public void onClick (Affichage de la vue) {new FetchFeedTask (). execute ((Void) null);}}; mSwipeLayout.setOnRefreshListener (new SwipeRefreshLayout.OnRefreshListener () {@Override public void onRefresh () {new FetchFeedTask (). execute ((void) null);}}); }} 

Button et SwipeRefreshLayout exécutent la même action, qui consiste à démarrer une nouvelle tâche FetchFeedTask. FetchFeedTask est à AsyncTask, ce qui nous permet d'effectuer de longues tâches en cours d'exécution dans un thread en arrière-plan. Si vous essayez d'extraire des flux d'une source sur le fil principal, votre application ne répondra plus et vous aurez peut-être cessé de fonctionner. Depuis Ice-Cream Sandwich, Android ne permet plus aux applications de passer des appels réseau sur le fil principal. Pour un rappel sur l'utilisation d'AsyncTask, vous pouvez consulter notre article précédent sur l'utilisation d'une API Web à partir de votre application Android.

FetchFeedTask a trois méthodes simples:

  1. onPreExecute, appelé avant le démarrage de la tâche longue, et exécuté sur le thread appelant.
  2. doInBackground, qui est la longue tâche en cours d'exécution, est exécuté dans un nouveau thread
  3. onPostExecute, qui est exécuté sur le thread appelant.

Étant donné qu'Android permet la manipulation d'éléments d'interface utilisateur (boutons, SwipeRefreshLayout, etc.) uniquement sur le fil d'interface utilisateur / principal, nous pouvons mettre à jour l'interface utilisateur à la fois onPreExecute et onPostExecute, mais pas dans doInBackground.

 classe privée FetchFeedTask étend AsyncTask {chaîne privée urlLink; @Override protected void onPreExecute () {mSwipeLayout.setRefreshing (true); urlLink = mEditText.getText (). toString (); } @Override protected Boolean doInBackground (void ... voids) {if (TextUtils.isEmpty (urlLink)) return false; try {if (! urlLink.startsWith ("//") &&! urlLink.startsWith ("//")) urlLink = "//" + urlLink; URL url = nouvelle URL (urlLink); InputStream inputStream = url.openConnection (). GetInputStream (); mFeedModelList = parseFeed (inputStream); retourne vrai; } catch (IOException e) {Log.e (TAG, "Erreur", e); } catch (XmlPullParserException e) {Log.e (TAG, "Erreur", e); } return false; } @Override protected void sur PostExecute (succès booléen) {mSwipeLayout.setRefreshing (false); if (success) {mFeedTitleTextView.setText ("Titre du flux:" + mFeedTitle); mFeedDescriptionTextView.setText ("Description du flux:" + mFeedDescription); mFeedLinkTextView.setText ("Lien de flux:" + mFeedLink); // Remplissez RecyclerView mRecyclerView.setAdapter (new RssFeedListAdapter (mFeedModelList)); } else {Toast.makeText (MainActivity.this, "Entrez une URL de flux RSS valide", Toast.LENGTH_LONG) .show (); }}} 

Dans l'extrait de code ci-dessus, vous ne pouvez voir l'interface utilisateur que dans onPreExecute et onPostExecute, tandis que tous les calculs sont effectués dans doInBackground. Nous définissons FetchFeedTask comme une classe interne dans MainActivity, afin de pouvoir accéder aux widgets de disposition MainActivity.

Dans doInBackground, nous confirmons d'abord que l'URL entrée n'est pas vide, puis nous ajoutons un '//' à l'URL si l'utilisateur l'a omis. L'étape suivante consiste à ouvrir une connexion url à l'aide de la méthode url.getConnection (). GetInputStream (). Enfin, nous appelons une méthode appelée parseFeed () pour analyser le flux RSS résultant.

Analyser le flux RSS

Heureusement, Android contient des classes d’utilitaires et des interfaces permettant de gérer l’analyse XML. Pour notre lecteur RSS, nous souhaitons utiliser l’instance XmlPullParser pour gérer l’analyse du flux. XmlPullParser peut avoir un InputStream ou un Reader comme source de données. Nous venons de lire chaque balise XML dans le flux RSS jusqu'à la fin du document. Vous pouvez le voir dans l'extrait XML ci-dessous, il s'agit d'un titre, d'une description ou d'un lien.

 liste publique parseFeed (InputStream inputStream) lève XmlPullParserException, IOException {String title = null; Lien de chaîne = null; Description de la chaîne = null; boolean isItem = false; Liste des éléments = new ArrayList (); try {XmlPullParser xmlPullParser = Xml.newPullParser (); xmlPullParser.setFeature (XmlPullParser.FEATURE_PROCESS_NAMESPACES, false); xmlPullParser.setInput (inputStream, null); xmlPullParser.nextTag (); while (xmlPullParser.next ()! = XmlPullParser.END_DOCUMENT) {int eventType = xmlPullParser.getEventType (); Nom de chaîne = xmlPullParser.getName (); si (nom == null) continue; if (eventType == XmlPullParser.END_TAG) {if (name.equalsIgnoreCase ("item")) {isItem = false; } continue; } if (eventType == XmlPullParser.START_TAG) {if (name.equalsIgnoreCase ("item")) {isItem = true; continuer; }} Log.d ("MyXmlParser", "Nom syntaxique ==>" + nom); String result = ""; if (xmlPullParser.next () == XmlPullParser.TEXT) {résultat = xmlPullParser.getText (); xmlPullParser.nextTag (); } if (name.equalsIgnoreCase ("title")) {title = result; } else if (name.equalsIgnoreCase ("link")) {link = result; } else if (name.equalsIgnoreCase ("description")) {description = result; } if (title! = null && link! = null && description! = null) {if (isItem) {RssFeedModel item = new RssFeedModel (titre, lien, description); Items.Add (objet); } else {mFeedTitle = titre; mFeedLink = link; mFeedDescription = description; } title = null; lien = zéro; description = null; isItem = false; }} renvoyer des éléments; } Enfin {inputStream.close (); }} 

RssFeedModel est une classe d'assistance simple.

 public class RssFeedModel {public String title; lien de chaîne publique; description de chaîne publique; public RssFeedModel (titre de chaîne, lien de chaîne, description de chaîne) {this.title = title; this.link = link; this.description = description; }} 

Affichage des flux

À ce stade, nous sommes prêts à récupérer et à analyser les flux RSS. Cependant, nous devons encore afficher les résultats dans notre lecteur de flux RSS RecyclerView. Rappelez-vous que dans la méthode onPostExecute () ci-dessus, il y a la ligne:

 mRecyclerView.setAdapter (new RssFeedListAdapter (mFeedModelList)); 

Encore une fois, si vous n’avez jamais utilisé RecyclerView auparavant, consultez notre précédent tutoriel sur l’utilisation de RecyclerView. Il est très facile et simple à utiliser. Pour créer un fichier de présentation, appelé item_rss_feed.xml.

Et enfin, le RssFeedListAdapter.

 Classe publique RssFeedListAdapter étend RecyclerView.Adapter {liste privée mRssFeedModels; Classe statique publique FeedModelViewHolder étend RecyclerView.ViewHolder {vue privée rssFeedView; public FeedModelViewHolder (vue v) {super (v); rssFeedView = v; }} public RssFeedListAdapter (Liste rssFeedModels) {mRssFeedModels = rssFeedModels; } @Override public FeedModelViewHolder onCreateViewHolder (ViewGroup parent, type int) {View v = LayoutInflater.from (parent.getContext ()) .inflate (R.layout.item_rss_feed, parent, false); FeedModelViewHolder titulaire = nouveau FeedModelViewHolder (v); titulaire du retour; } @Override public void onBindViewHolder (titulaire de FeedModelViewHolder, int position) {final RssFeedModel rssFeedModel = mRssFeedModels.get (position); . ((Texte Voir) holder.rssFeedView.findViewById (R.id.titleText)) setText (rssFeedModel.title); ((TextView) holder.rssFeedView.findViewById (R.id.descriptionText)) .setText (rssFeedModel.description); ((Texte Voir) holder.rssFeedView.findViewById (R.id.linkText)) setText (rssFeedModel.link). } @Override public int getItemCount () {return mRssFeedModels.size (); }} 

Envelopper

Comme toujours, la source complète est disponible sur github. Vous pouvez envisager de styler votre item_rss_feed.xml, en affichant plus de contenu que le titre, la description et le lien, et / ou pour les plus aventureux, en écrivant votre propre aggrégateur de nouvelles RSS avec plusieurs flux provenant de plusieurs sources.

Bonne codage.

Recommandé

  • Google Play Store rencontre des erreurs d'installation / de mise à jour étranges [Mise à jour: il fonctionne à nouveau]
    nouvelles

    Google Play Store rencontre des erreurs d'installation / de mise à jour étranges [Mise à jour: il fonctionne à nouveau]

  • Microsoft acquiert officiellement Acompli, l'application de messagerie Android
    nouvelles

    Microsoft acquiert officiellement Acompli, l'application de messagerie Android

  • Google Play Music a complètement revu l'intégration de Chromecast
    applications et jeux

    Google Play Music a complètement revu l'intégration de Chromecast

  • Test du Sony Xperia Tablet Z (vidéo)
    traits

    Test du Sony Xperia Tablet Z (vidéo)

  • Les jeux LEGO Harry Potter enfin au Play Store
    applications et jeux

    Les jeux LEGO Harry Potter enfin au Play Store

  • YouTube est mécontent de la limitation des données vidéo par T-Mobile
    nouvelles

    YouTube est mécontent de la limitation des données vidéo par T-Mobile

Articles Populaires 2022

  • Samsung Chromebook Plus est le deuxième appareil compatible avec les applications Linux
    nouvelles

    Samsung Chromebook Plus est le deuxième appareil compatible avec les applications Linux

  • Rencontrez les développeurs - Catalina Group Ltd.
    développement Android

    Rencontrez les développeurs - Catalina Group Ltd.

  • Rapport: Google travaille sur le service de voiture pour concurrencer Uber et Lyft
    nouvelles

    Rapport: Google travaille sur le service de voiture pour concurrencer Uber et Lyft

  • Le téléphone pliable de Samsung est-il apparu dans cette vidéo officielle?

  • Google Pixel 3: Où acheter, quand et combien (Mise à jour: les ventes générales commencent)

  • Sony n'a pas de plan pour Windows Phone 8

Des Articles Intéressants 2022

  • Lenovo pas les smartphones VIBE P1, P1m et S1 à l'IFA 2015

  • Où acheter Google Home, Home Mini et Home Max (Mise à jour: Home Max maintenant en vente)

  • 'OK Google, Lumos Maxima!': Transformez votre téléphone en un mur avec Google

  • Xiaomi MI-2 s'est dirigé vers China Telecom, le fournisseur d'accès CDMA, le 26 janvier

  • Utilisation de l'API ThingSpeak pour suivre l'emplacement d'un périphérique

Choix De L'Éditeur

applications et jeux

La facturation par l'opérateur Sprint pour Spotify Premium arrive aujourd'hui

  • Aujourd'hui, votre dernière chance d'obtenir Nexus 5x pour 80 $ de rabais

  • La mise à jour OnePlus 6 améliore les modes Wi-Fi et Nightscape. OnePlus 5 / 5T est également mis à jour.

  • Les nouveaux exploits de Stagefright mettent en danger plus d'un milliard d'appareils Android

logo

  • De nouvelles images montrent le Huawei Ascend D2, Ascend Mate et le W1 Windows Phone

    De nouvelles images montrent le Huawei Ascend D2, Ascend Mate et le W1 Windows Phone

    nouvelles
  • Fuite d'une photo d'un présumé Moto G6 Play

    Fuite d'une photo d'un présumé Moto G6 Play

    nouvelles
  • Gmail sur le bureau peut désormais prendre en charge le streaming de vidéos dans des emails

    Gmail sur le bureau peut désormais prendre en charge le streaming de vidéos dans des emails

    nouvelles
  • LG G7 One Hands-on: Android One, mais un appareil allégé

    LG G7 One Hands-on: Android One, mais un appareil allégé

    August 11,2022
  • Google Helpouts - Tout ce que vous devez savoir

    Google Helpouts - Tout ce que vous devez savoir

    August 11,2022
  • Voulez-vous pirater pour gagner votre vie?

    Voulez-vous pirater pour gagner votre vie?

    August 11,2022
développement Android © Copyright 2022. All rights reserved.