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:
- onPreExecute, appelé avant le démarrage de la tâche longue, et exécuté sur le thread appelant.
- doInBackground, qui est la longue tâche en cours d'exécution, est exécuté dans un nouveau thread
- 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.