`
jandroid
  • 浏览: 1953893 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

使用android-rss库实现从网络中获取rss信息,并通过ListView显示

 
阅读更多

团队最近打算出一款rss订阅功能的应用,本文针对通过网络http的方式获取xml的rss来做一个技术准备。
在rss reader方面,目前有一些比较成熟的应用,比如腾讯的腾讯订阅,蘑菇新闻等。个人比较喜欢简洁的蘑菇新闻。团队也针对这个做了反编译。

针对rss的应用,会涵盖http、xml解析、多线程、异步等操作。而在xml解析方面,我选择了托管在github上面的android-rss项目作为基库。参考文章[1].

android-rss库使用org.xml.sax.helpers.DefaultHandler进行解析xml,通过网络流的方式来作为解析数据的传入。然后将解析后的数据存储在RSSFeed的items中,通过函数getItems即可得到所处理后的数据。

使用步骤如下:
1 从https://github.com/ahorn/android-rss将项目代码下载到本地,可以是zip的格式。
2 解压代码到某个目录
3 使用eclipse 创建一个项目,本文取项目名称为WPReader(WordPress Reader).
4 点击src目录,创建一个新的package,取名org.mcsoxford.rss.必须是这个名字。
5 在这个包上面点击右键,弹出import
6 选择FileSystem
7 然后选择我们刚才的zip解压目录
8 将所有的文件导入即可。下面我们就可以使用这个所有的代码了。
9 创建一个item.xml用于显示每个单独的Title.
10 main.xml里面放置一个ListView即可。

主代码如下:

package com.jouhu.reader;
 
import java.util.ArrayList;
import java.util.HashMap;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import org.mcsoxford.rss.*;
 
public class WPReaderActivity extends Activity {
    /** Called when the activity is first created. */
    public String tag = "WPReaderActivity";
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        //创建一个RSSReader
        RSSReader reader = new RSSReader();
        String url = "http://feeds.bbci.co.uk/news/world/rss.xml";
        //创建一个ArrayList用于存储rss数据
        ArrayList<HashMap<String, Object>> listItem = new ArrayList<HashMap<String, Object>>();
        try {
            //这是最核心的方法,reader.load会解析url上面的xml文件
            RSSFeed feed = reader.load(url);
            EditText et = (EditText)findViewById(R.id.editText1);
            et.setText(feed.getDescription());
            Integer it = feed.getItems().size();
            //将所有的解析到的数据加入到listItem中
            for(int i = 0 ; i < it ; i ++)
            {
                RSSItem item = feed.getItems().get(i);
                HashMap<String, Object> map = new HashMap<String, Object>();
                map.put("itemtitle", item.getTitle());
                //map.put("itemcontent", item.getDescription());
                map.put("itemcontent", "");
                listItem.add(map);
            }
        } catch (RSSReaderException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        ListView lv = (ListView)findViewById(R.id.listView1);
        //构造一个Adapter
        SimpleAdapter listItemAdapter =
            new SimpleAdapter(this, listItem,R.layout.item, new String[]{"itemtitle","itemcontent"}, new int[]{R.id.title,R.id.content});
        lv.setAdapter(listItemAdapter);
    }
}

效果图:

注意第八项中,这是一个通用方法,对于一些开源的库,我们经常可以这样使用。将其所有的源代码加入到项目中,然后直接调用其库的代码。

在本项目中,最重要的一个地方就是RSSHandler类的构造。在参考文章[2]/[3]/[4]分别提到的这个类的构造方法。
在继承的时候几个最重要的方法startDocument、endDocument、startElement、endElement、characters是一般需要重载实现的。这里可以对我们需要解析的xml文件进行针对性的处理。参加下面从参考文献[3]中的demo代码。

import org.xml.sax.*;
import org.xml.sax.helpers.*;
import java.io.*;
public class MyDefaultHandler extends DefaultHandler {
    private StringBuffer buf;
    public void startDocument() throws SAXException {
        buf=new StringBuffer();
        System.out.println("*******开始解析文档*******");
    }
    public void endDocument() throws SAXException {
        System.out.println("*******解析文档结束*******");
    }
    public void startPrefixMapping( String prefix, String uri ) {
System.out.println("\n前缀映射: " + prefix +" 开始!"+ "  它的URI是:"+uri);
    }
    public void endPrefixMapping( String prefix ) {
       System.out.println("\n前缀映射: "+prefix+" 结束!");
    }
    public void startElement( String namespaceURI, String localName,
                                  String fullName, Attributes attributes )
                          throws SAXException {
        System.out.println("\n元素: " + "["+fullName+"]" +" 开始解析!");
        // 打印出属性信息
        for ( int i = 0; i < attributes.getLength(); i++ ) {
            System.out.println("\t属性名称:" + attributes.getLocalName(i)
                + " 属性值:" + attributes.getValue(i));
        }
    }
    public void endElement( String namespaceURI, String localName,
                                                      String fullName )
                          throws SAXException {
       //打印出非空的元素内容并将StringBuffer清空
       String nullStr="";
       if (!buf.toString().trim().equals(nullStr)){
          System.out.println("\t内容是: " + buf.toString().trim());
       }
       buf.setLength(0);
       //打印元素解析结束信息
        System.out.println("元素: "+"["+fullName+"]"+" 解析结束!");
    }
    public void characters( char[] chars, int start, int length )
                                throws SAXException {
       //将元素内容累加到StringBuffer中
       buf.append(chars,start,length);
    }
    public void warning( SAXParseException exception ) {
        System.out.println("*******WARNING******");
        System.out.println("\t行:\t" + exception.getLineNumber());
        System.out.println("\t列:\t" + exception.getColumnNumber());
        System.out.println("\t错误信息:\t" + exception.getMessage());
        System.out.println("********************");
    }
    public void error( SAXParseException exception ) throws SAXException{
        System.out.println("******* ERROR ******");
        System.out.println("\t行:\t" + exception.getLineNumber());
        System.out.println("\t列:\t" + exception.getColumnNumber());
        System.out.println("\t错误信息:\t" + exception.getMessage());
        System.out.println("********************");
    }
    public void fatalError( SAXParseException exception ) throws SAXException {
        System.out.println("******** FATAL ERROR ********");
        System.out.println("\t行:\t" + exception.getLineNumber());
        System.out.println("\t列:\t" + exception.getColumnNumber());
        System.out.println("\t错误信息:\t" + exception.getMessage());
        System.out.println("*****************************");
    }
}
0
0
分享到:
评论

相关推荐

    Android-Rss.rar_android_rss阅读器_阅读器

    【Android RSS阅读器】是一款基于Android 2.0+平台的源码实现,它主要用于帮助用户获取并阅读RSS(Really Simple Syndication)订阅内容。RSS是一种简易信息聚合(也称为富站点摘要或RSS feed)的格式,常用于新闻...

    Android代码-Rss订阅源码Demo.zip

    在Android平台上,RSS(Really Simple Syndication)订阅是一种常见的数据获取和内容分发方式,它允许用户通过XML格式从各种网站获取更新的信息,如新闻、博客文章等。本示例"Rss订阅源码Demo.zip"提供了一个Android...

    android_RSS经典开发教程

    2. **使用Android呈现RSS数据**:在Android中,可以使用ListView控件来显示RSS项的列表。下面是一个简单的示例代码: ```xml &lt;ListView android:id="@+id/rss_list" android:layout_width="match_parent" ...

    一个基于新浪RSS的android RSS阅读器源码

    在这个特定的项目中,源码是针对新浪RSS服务设计的,这意味着它会连接到新浪提供的RSS源,获取新闻标题、摘要、发布时间等信息,并在Android应用中展示。 在源码中,关键组件可能包括: 1. **网络请求模块**:这...

    RSS.zip_RSS_RSS Java_android RSS_rss android_rss android

    在Android平台上开发RSS阅读器是一项常见且实用的任务,它能够帮助用户轻松获取并阅读网络上的RSS订阅源。这个"RSS.zip_RSS_RSS Java_android RSS_rss android_rss android"项目,显然是一款针对Android设备的RSS...

    新浪RSS 阅读器 android源码

    2. **网络请求与数据解析**:源码中可能使用了HttpURLConnection或OkHttp等库进行网络请求,获取RSS feed的XML数据。然后,使用如Java内置的DOM、SAX或Pull Parser或者第三方库如Jsoup来解析XML,提取所需信息。 3....

    Android代码-RSS阅读器的源码.zip

    3. **数据模型与适配器**:在Android中,数据通常存储在自定义的Java类(数据模型)中,然后通过ListView或RecyclerView等组件显示。RSS阅读器需要创建一个RSSItem类,包含标题、链接、描述等属性,以及一个适配器类...

    android rss阅读器源码

    Android RSS阅读器源码是一个专门为Android平台设计的应用程序,它能解析RSS feed并显示在用户友好的界面上。下面我们将深入探讨该源码中的关键知识点。 1. **XML解析**: Android RSS阅读器首先需要处理XML文件,...

    Android综合案例——RSS阅读器实源代码+讲解

    - 使用`HttpURLConnection`或第三方库如`OkHttp`进行网络请求,获取RSS XML文件。 - 解析XML:可以使用`Java内置的DOM解析器`,但更常见的是使用`SAX`或`Pull解析器`,因为它们更高效且内存占用小。Android还提供...

    Android应用源码SimpleReader-rss聚合阅读器

    SimpleReader是一款基于Android平台的RSS聚合阅读器,它能够帮助用户订阅并管理多个RSS源,方便地获取和阅读各种在线内容。通过分析其源码,我们可以深入理解Android应用开发中的核心技术和设计模式。 1. **RSS聚合...

    android rss源码

    7. **UI显示**:解析完成的数据需要绑定到ListView或RecyclerView等视图组件上,可以使用ArrayAdapter或RecyclerView.Adapter来实现数据和视图的绑定。 8. **异常处理**:网络请求和XML解析过程中可能会出现异常,...

    android rss 解析 附图片

    `RssSaxActivity3.java`和`RssSaxParser.java`这两个文件分别处理了UI逻辑和数据解析,通过SAX解析器高效地处理XML数据,结合图片加载库,实现了从RSS feed获取和展示带有图片的新闻内容。理解这一过程对于任何想要...

    Android开发实例:rss阅读器 源码

    在Android开发中,构建RSS阅读器的第一步是获取RSS feed。这通常通过HTTP请求完成,可以使用`HttpURLConnection`或第三方库如Volley、OkHttp。请求完成后,我们需要解析返回的XML数据。Android提供了`XmlPullParser`...

    Android源码——Rss订阅源码Demo.7z

    在Android应用中,通常会有一个列表视图(ListView)或者RecyclerView来显示订阅的RSS条目。这些条目通常包括标题、发布时间以及简短的描述。通过适配器(Adapter)将解析得到的数据绑定到列表项,实现动态加载和...

    Android RSS阅读器的源码.rar

    通过分析这个Android RSS阅读器的源码,开发者可以学习到如何在Android平台上进行网络请求、XML解析、数据库操作以及UI设计等关键技术。同时,这也是一个很好的实践项目,可以帮助开发者巩固和提升Android应用开发的...

    android RSS阅读器

    在RSS阅读器中,我们可能需要使用ListView或RecyclerView展示RSS条目,使用WebView显示文章详情。此外,还可以添加搜索、过滤、离线阅读等功能,提升用户体验。 在实际开发过程中,RSSReader项目会包含以下关键组件...

    新浪rss阅读器android源码

    6. **ListView与Adapter**:RSS条目通常会显示在一个列表中,因此,你需要理解如何使用ListView和自定义Adapter来展示数据。Adapter将数据模型与视图绑定,使得数据能够正确地渲染到ListView的每一项。 7. **异步...

    Google.Android开发入门与实战第12章.Android综合案例一——RSS阅读器实例

    5. **ListView与Adapter**:Android中的ListView是展示大量数据的常用控件,RSS阅读器通常会使用它来显示文章列表。Adapter类用于将数据源绑定到ListView,实现数据和视图的分离。 6. **数据持久化**:为了优化用户...

    Manage Rss With NRP Android

    "Manage Rss With NRP Android"这个主题主要涵盖了如何使用Android技术来处理RSS数据并将其显示在ListView中。RSS(Really Simple Syndication)是一种XML格式,用于发布和订阅网站内容,如新闻文章或博客更新。 ...

    构建Android手机RSS阅读器

    本教程主要涵盖了如何在Android平台上开发一个RSS阅读器应用,由IBM官方提供,旨在帮助开发者深入理解Android应用开发,并掌握RSS数据解析与展示的技术。RSS(Really Simple Syndication)是一种内容发布格式,常...

Global site tag (gtag.js) - Google Analytics