Android - Lettore RSS

RSS sta per Really Simple Syndication. RSS è un modo semplice per condividere gli aggiornamenti e i contenuti del tuo sito web con i tuoi utenti in modo che gli utenti non debbano visitare il tuo sito ogni giorno per alcun tipo di aggiornamento.

Esempio RSS

RSS è un documento creato dal sito web con estensione .xml. Puoi facilmente analizzare questo documento e mostrarlo all'utente nella tua applicazione. Un documento RSS ha questo aspetto.

<rss version="2.0">
   <channel>
      <title>Sample RSS</title>
      <link>http://www.google.com</link>
      <description>World's best search engine</description>
   </channel>
</rss>

Elementi RSS

Un documento RSS come sopra ha i seguenti elementi.

Suor n Componente e descrizione
1

channel

Questo elemento viene utilizzato per descrivere il feed RSS

2

title

Definisce il titolo del canale

3

link

Definisce il collegamento ipertestuale al canale

4

description

Descrive il canale

Analisi RSS

L'analisi di un documento RSS è più simile all'analisi di XML. Quindi ora vediamo come analizzare un documento XML.

Per questo, creeremo l'oggetto XMLPullParser, ma per crearlo creeremo prima l'oggetto XmlPullParserFactory e quindi chiameremo il suo metodo newPullParser () per creare XMLPullParser. La sua sintassi è data di seguito:

private XmlPullParserFactory xmlFactoryObject = XmlPullParserFactory.newInstance();
private XmlPullParser myparser = xmlFactoryObject.newPullParser();

Il passaggio successivo prevede la specifica del file per XmlPullParser che contiene XML. Potrebbe essere un file o potrebbe essere un flusso. Nel nostro caso è un flusso, la cui sintassi è data di seguito:

myparser.setInput(stream, null);

L'ultimo passaggio è analizzare l'XML. Un file XML è composto da eventi, Nome, Testo, AttributesValue ecc. Quindi XMLPullParser ha una funzione separata per l'analisi di ogni componente del file XML. La sua sintassi è data di seguito:

int event = myParser.getEventType();
while (event != XmlPullParser.END_DOCUMENT)  {
   String name=myParser.getName();
   
   switch (event){
      case XmlPullParser.START_TAG:
      break;
      
      case XmlPullParser.END_TAG:
      if(name.equals("temperature")){
         temperature = myParser.getAttributeValue(null,"value");
      }
      break;
   }		 
   event = myParser.next(); 					
}

Il metodo getEventTyperestituisce il tipo di evento che si verifica. ad esempio: inizio documento, inizio tag, ecc. Il metodogetName restituisce il nome del tag e poiché siamo interessati solo alla temperatura, quindi controlliamo semplicemente nell'istruzione condizionale che se abbiamo un tag di temperatura, chiamiamo il metodo getAttributeValue per restituirci il valore del tag di temperatura.

Oltre a questi metodi, ci sono altri metodi forniti da questa classe per analizzare meglio i file XML. Questi metodi sono elencati di seguito:

Suor n Metodo e descrizione
1

getAttributeCount()

Questo metodo restituisce solo il numero di attributi del tag di inizio corrente.

2

getAttributeName(int index)

Questo metodo restituisce il nome dell'attributo specificato dal valore di indice.

3

getColumnNumber()

Questo metodo restituisce Restituisce il numero di colonna corrente, a partire da 0.

4

getDepth()

Questo metodo restituisce Restituisce la profondità corrente dell'elemento.

5

getLineNumber()

Restituisce il numero di riga corrente, a partire da 1.

6

getNamespace()

Questo metodo restituisce l'URI dello spazio dei nomi dell'elemento corrente.

7

getPrefix()

Questo metodo restituisce il prefisso dell'elemento corrente.

8

getName()

Questo metodo restituisce il nome del tag.

9

getText()

Questo metodo restituisce il testo per quel particolare elemento.

10

isWhitespace()

Questo metodo controlla se l'evento TEXT corrente contiene solo caratteri di spazio vuoto.

Esempio

Ecco un esempio che dimostra l'uso della classe XMLPullParser. Crea un'applicazione di analisi di base che ti consente di analizzare un documento RSS presente qui in /android/sampleXML.xml e quindi mostrare il risultato.

Per sperimentare questo esempio, puoi eseguirlo su un dispositivo reale o in un emulatore.

Passi Descrizione
1 Utilizzerai Android Studio per creare un'applicazione Android con un pacchetto com.example.sairamkrishna.myapplication.
2 Modifica il file src / MainActivity.java per aggiungere il codice necessario.
3 Modifica res / layout / activity_main per aggiungere i rispettivi componenti XML.
4 Crea un nuovo file java in src / HandleXML.java per recuperare e analizzare i dati XML.
5 Crea un nuovo file java in src / second.java per visualizzare il risultato di XML
5 Modifica AndroidManifest.xml per aggiungere l'autorizzazione Internet necessaria.
6 Esegui l'applicazione e scegli un dispositivo Android in esecuzione, installa l'applicazione su di esso e verifica i risultati.

Di seguito è riportato il contenuto del file di attività principale modificato src/MainActivity.java.

package com.example.sairamkrishna.myapplication;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;

import android.widget.Button;
import android.widget.EditText;


public class MainActivity extends Activity {
   EditText title,link,description;
   Button b1,b2;
   private String finalUrl="http://tutorialspoint.com/android/sampleXML.xml";
   private HandleXML obj;

   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);

      title = (EditText) findViewById(R.id.editText);
      link = (EditText) findViewById(R.id.editText2);
      description = (EditText) findViewById(R.id.editText3);

      b1=(Button)findViewById(R.id.button);
      b2=(Button)findViewById(R.id.button2);
      b1.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View v) {
            obj = new HandleXML(finalUrl);
            obj.fetchXML();

            while(obj.parsingComplete);
            title.setText(obj.getTitle());
            link.setText(obj.getLink());
            description.setText(obj.getDescription());
         }
      });

      b2.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View v) {
            Intent in=new Intent(MainActivity.this,second.class);
            startActivity(in);
         }
      });
   }

}

Di seguito è riportato il contenuto del file java src/HandleXML.java.

package com.example.rssreader;

import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;

import android.util.Log;

public class HandleXML {
   private String title = "title";
   private String link = "link";
   private String description = "description";
   private String urlString = null;
   private XmlPullParserFactory xmlFactoryObject;
   public volatile boolean parsingComplete = true;
   
   public HandleXML(String url){
      this.urlString = url;
   }
   
   public String getTitle(){
      return title;
   }
   
   public String getLink(){
      return link;
   }
   
   public String getDescription(){
      return description;
   }
   
   public void parseXMLAndStoreIt(XmlPullParser myParser) {
      int event;
      String text=null;
      
      try {
         event = myParser.getEventType();
         
         while (event != XmlPullParser.END_DOCUMENT) {
         String name=myParser.getName();
         
         switch (event){
            case XmlPullParser.START_TAG:
            break;
            
            case XmlPullParser.TEXT:
            text = myParser.getText();
            break;
            
            case XmlPullParser.END_TAG:
            
            if(name.equals("title")){
               title = text;
            }
            
            else if(name.equals("link")){
               link = text;
            }
            
            else if(name.equals("description")){
               description = text;
            }
            
            else{
            }
            
            break;
            }
            
            event = myParser.next(); 
            }
            
            parsingComplete = false;
            }
            
            catch (Exception e) {
               e.printStackTrace();
            }
         }
         
         public void fetchXML(){
            Thread thread = new Thread(new Runnable(){
               @Override
               public void run() {
               
               try {
               URL url = new URL(urlString);
               HttpURLConnection conn = (HttpURLConnection) url.openConnection();
               
               conn.setReadTimeout(10000 /* milliseconds */);
               conn.setConnectTimeout(15000 /* milliseconds */);
               conn.setRequestMethod("GET");
               conn.setDoInput(true);
               
               // Starts the query
               conn.connect();
               InputStream stream = conn.getInputStream();
               
               xmlFactoryObject = XmlPullParserFactory.newInstance();
               XmlPullParser myparser = xmlFactoryObject.newPullParser();
               
               myparser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
               myparser.setInput(stream, null);
               
               parseXMLAndStoreIt(myparser);
               stream.close();
            }
            
            catch (Exception e) {
            }
         }
      });
      thread.start(); 
   }
}

Crea un file e denominato file second.java nella directory java/second.java

package com.example.sairamkrishna.myapplication;

import android.app.Activity;
import android.os.Bundle;
import android.webkit.WebView;

public class second extends Activity {
   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.second_activity);
      WebView w1=(WebView)findViewById(R.id.webView);
      w1.loadUrl("http://tutorialspoint.com/android/sampleXML.xml");
   }
}

Crea un file xml in res/layout/second_activity.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:orientation="vertical" android:layout_width="match_parent"
   android:layout_height="match_parent">
   
   <WebView
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:id="@+id/webView"
      android:layout_gravity="center_horizontal" />
</LinearLayout>

Modifica il contenuto di res/layout/activity_main.xml al seguente -

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
   android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
   android:paddingRight="@dimen/activity_horizontal_margin"
   android:paddingTop="@dimen/activity_vertical_margin"
   android:paddingBottom="@dimen/activity_vertical_margin"
   tools:context=".MainActivity"
   android:transitionGroup="true">
   
   <TextView android:text="RSS example" android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:id="@+id/textview"
      android:textSize="35dp"
      android:layout_alignParentTop="true"
      android:layout_centerHorizontal="true" />
      
   <TextView
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Tutorials point"
      android:id="@+id/textView"
      android:layout_below="@+id/textview"
      android:layout_centerHorizontal="true"
      android:textColor="#ff7aff24"
      android:textSize="35dp" />
      
   <ImageView
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:id="@+id/imageView"
      android:src="@drawable/abc"
      android:layout_below="@+id/textView"
      android:layout_centerHorizontal="true"
      android:theme="@style/Base.TextAppearance.AppCompat" />
      
   <EditText
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:id="@+id/editText"
      android:layout_below="@+id/imageView"
      android:hint="Tittle"
      android:textColorHint="#ff69ff0e"
      android:layout_alignParentRight="true"
      android:layout_alignParentEnd="true"
      android:layout_alignParentLeft="true"
      android:layout_alignParentStart="true" />
      
   <EditText
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:id="@+id/editText2"
      android:layout_below="@+id/editText"
      android:layout_alignLeft="@+id/editText"
      android:layout_alignStart="@+id/editText"
      android:textColorHint="#ff21ff11"
      android:hint="Link"
      android:layout_alignRight="@+id/editText"
      android:layout_alignEnd="@+id/editText" />
      
   <EditText
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:id="@+id/editText3"
      android:layout_below="@+id/editText2"
      android:layout_alignLeft="@+id/editText2"
      android:layout_alignStart="@+id/editText2"
      android:hint="Description"
      android:textColorHint="#ff33ff20"
      android:layout_alignRight="@+id/editText2"
      android:layout_alignEnd="@+id/editText2" />
      
   <Button
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Fetch"
      android:id="@+id/button"
      android:layout_below="@+id/editText3"
      android:layout_alignParentLeft="true"
      android:layout_alignParentStart="true"
      android:layout_toLeftOf="@+id/imageView"
      android:layout_toStartOf="@+id/imageView" />
      
   <Button
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Result"
      android:id="@+id/button2"
      android:layout_alignTop="@+id/button"
      android:layout_alignRight="@+id/editText3"
      android:layout_alignEnd="@+id/editText3" />

</RelativeLayout>

Modifica il file res/values/string.xml al seguente

<resources>
   <string name="app_name">My Application</string>
</resources>

Questa è l'impostazione predefinita AndroidManifest.xml.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.example.sairamkrishna.myapplication" >
   <uses-permission android:name="android.permission.INTERNET"/>
   
   <application
      android:allowBackup="true"
      android:icon="@mipmap/ic_launcher"
      android:label="@string/app_name"
      android:theme="@style/AppTheme" >
      
      <activity
         android:name=".MainActivity"
         android:label="@string/app_name" >
      
         <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
         </intent-filter>
         
      </activity>
      
      <activity android:name=".second"></activity>
   </application>
</manifest>

Proviamo a eseguire la tua applicazione. Presumo che tu abbia creato il tuoAVDdurante l'impostazione dell'ambiente. Per eseguire l'app da Android Studio, apri uno dei file di attività del tuo progetto e fai clic sull'icona Esegui dalla barra degli strumenti. Android Studio installa l'app sul tuo AVD e la avvia e se tutto va bene con la configurazione e l'applicazione, verrà visualizzata la seguente finestra dell'emulatore:

Basta premere il pulsante Fetch Feed per recuperare il feed RSS. Dopo aver premuto, apparirà la seguente schermata che mostrerà i dati RSS.

Basta premere il pulsante dei risultati per vedere XML, che si trova in http://tutorialspoint.com/android/sampleXML.xml