Android - czytnik RSS
RSS to skrót od Really Simple Syndication. RSS to łatwy sposób na udostępnianie użytkownikom aktualizacji i treści witryny internetowej, dzięki czemu użytkownicy nie muszą codziennie odwiedzać witryny w celu uzyskania jakichkolwiek aktualizacji.
Przykład RSS
RSS to dokument tworzony przez serwis WWW z rozszerzeniem .xml. Możesz łatwo przeanalizować ten dokument i pokazać go użytkownikowi w swojej aplikacji. Dokument RSS wygląda następująco.
<rss version="2.0">
<channel>
<title>Sample RSS</title>
<link>http://www.google.com</link>
<description>World's best search engine</description>
</channel>
</rss>
Elementy RSS
Dokument RSS, taki jak powyżej, zawiera następujące elementy.
Sr.No | Opis podzespołu |
---|---|
1 | channel Ten element służy do opisu źródła RSS |
2 | title Określa tytuł kanału |
3 | link Definiuje hiperłącze do kanału |
4 | description Opisuje kanał |
Przetwarzanie RSS
Przetwarzanie dokumentu RSS jest bardziej podobne do analizowania XML. Zobaczmy teraz, jak przeanalizować dokument XML.
W tym celu stworzymy obiekt XMLPullParser, ale aby go stworzyć, najpierw utworzymy obiekt XmlPullParserFactory, a następnie wywołamy jego metodę newPullParser (), aby utworzyć XMLPullParser. Jego składnia jest podana poniżej -
private XmlPullParserFactory xmlFactoryObject = XmlPullParserFactory.newInstance();
private XmlPullParser myparser = xmlFactoryObject.newPullParser();
Następny krok obejmuje określenie pliku dla XmlPullParser, który zawiera XML. Może to być plik lub strumień. W naszym przypadku jest to strumień, którego składnię podano poniżej -
myparser.setInput(stream, null);
Ostatnim krokiem jest przeanalizowanie XML. Plik XML składa się ze zdarzeń, nazwy, tekstu, wartości atrybutów itp. Dlatego XMLPullParser ma oddzielną funkcję do analizowania każdego składnika pliku XML. Jego składnia jest podana poniżej -
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();
}
Metoda getEventTypezwraca typ zdarzenia, które ma miejsce. np .: Początek dokumentu, początek tagu itp. MetodagetName zwraca nazwę tagu, a ponieważ interesuje nas tylko temperatura, więc sprawdzamy w instrukcji warunkowej, że jeśli mamy tag temperatury, wywołujemy metodę getAttributeValue aby zwrócić nam wartość tagu temperatury.
Oprócz tych metod istnieją inne metody zapewniane przez tę klasę w celu lepszego analizowania plików XML. Te metody są wymienione poniżej -
Sr.No | Metoda i opis |
---|---|
1 | getAttributeCount() Ta metoda po prostu Zwraca liczbę atrybutów bieżącego tagu początkowego. |
2 | getAttributeName(int index) Ta metoda zwraca nazwę atrybutu określonego przez wartość indeksu. |
3 | getColumnNumber() Ta metoda zwraca Zwraca numer bieżącej kolumny, zaczynając od 0. |
4 | getDepth() Ta metoda zwraca Zwraca bieżącą głębokość elementu. |
5 | getLineNumber() Zwraca numer bieżącego wiersza, zaczynając od 1. |
6 | getNamespace() Ta metoda zwraca identyfikator URI przestrzeni nazw bieżącego elementu. |
7 | getPrefix() Ta metoda zwraca prefiks bieżącego elementu. |
8 | getName() Ta metoda zwraca nazwę tagu. |
9 | getText() Ta metoda zwraca tekst dla tego konkretnego elementu. |
10 | isWhitespace() Ta metoda sprawdza, czy bieżące zdarzenie TEXT zawiera tylko białe znaki. |
Przykład
Oto przykład demonstrujący użycie klasy XMLPullParser. Tworzy podstawową aplikację analizującą, która umożliwia przeanalizowanie dokumentu RSS znajdującego się tutaj w /android/sampleXML.xml, a następnie wyświetlenie wyniku.
Aby poeksperymentować z tym przykładem, możesz uruchomić to na rzeczywistym urządzeniu lub w emulatorze.
Kroki | Opis |
---|---|
1 | Użyjesz Android Studio do stworzenia aplikacji na Androida w pakiecie com.example.sairamkrishna.myapplication. |
2 | Zmodyfikuj plik src / MainActivity.java, aby dodać niezbędny kod. |
3 | Zmodyfikuj res / layout / activity_main, aby dodać odpowiednie komponenty XML. |
4 | Utwórz nowy plik java w src / HandleXML.java, aby pobrać i przeanalizować dane XML. |
5 | Utwórz nowy plik java w lokalizacji src / second.java, aby wyświetlić wynik XML |
5 | Zmodyfikuj plik AndroidManifest.xml, aby dodać niezbędne uprawnienia internetowe. |
6 | Uruchom aplikację i wybierz działające urządzenie z systemem Android, zainstaluj na nim aplikację i sprawdź wyniki. |
Poniżej znajduje się zawartość zmodyfikowanego pliku głównego działania 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);
}
});
}
}
Poniżej znajduje się zawartość pliku 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();
}
}
Utwórz plik i nazwij go jako plik second.java w katalogu 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");
}
}
Utwórz plik xml pod adresem 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>
Zmodyfikuj zawartość res/layout/activity_main.xml do następujących -
<?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>
Zmodyfikuj res/values/string.xml do następujących
<resources>
<string name="app_name">My Application</string>
</resources>
To jest ustawienie domyślne 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>
Spróbujmy uruchomić Twoją aplikację. Zakładam, że stworzyłeś swójAVDpodczas konfigurowania środowiska. Aby uruchomić aplikację ze studia Android, otwórz jeden z plików aktywności projektu i kliknij
Wystarczy nacisnąć przycisk Fetch Feed, aby pobrać kanał RSS. Po naciśnięciu pojawi się następujący ekran pokazujący dane RSS.
Wystarczy nacisnąć przycisk wyniku, aby zobaczyć XML, który jest umieszczony w http://tutorialspoint.com/android/sampleXML.xml