`
huangqinqin
  • 浏览: 360321 次
  • 性别: Icon_minigender_2
  • 来自: 福州
社区版块
存档分类
最新评论

RssReader.java解析

 
阅读更多
RssReader.java解析:
1  触发download的click事件,调用doRSS(Url)方法。
2  在doRss(Url)中通过rssUrl构造RSSWorker线程实例。
3  在RSSWorker中处理从网络上下载xml的动作。并调用parseRSS(in, mAdapter)方法解析xml文件。
4  在parseRSS()方法中,在解析一个item后,通过mHandler.post(new ItemAdder(item))方法将解析
   后的单个item发送到mAdapter中,ItemAdder是一个线程,即将new ItemAdder(item)产生后的实例
   post到mHandler的消息队列中。通过消息队列循环的将item加入到mAdapter中。

总结:启动一个线程处理下载xml数据的动作,并解析下载xml数据。在这个现在里通过handler发送一个Message,以便更新数据。
而Handler发送Message时采用post(Runnable r)的方式,在Runnable中处理为adapter增加数据的动作,以便adapter中
的item及时更新UI显示。

方法附录:

   private void doRSS(CharSequence rssUrl) {
        RSSWorker worker = new RSSWorker(rssUrl);
        setCurrentWorker(worker);

        resetUI();
        mStatusText.setText("Downloading\u2026");

        worker.start();
    }
先调用setCurrentWorker(worker)设置当前的worker,然后调用resetUI。在resetUI中利用mAdapter适配ListView。以达到更新UI的效果。

2
    public synchronized void setCurrentWorker(RSSWorker worker) {
        if (mWorker != null) mWorker.interrupt();
        mWorker = worker;
    }
这个方法实现的功能是:中断一个线程(RSSWorker构造的),设置新的线程。


3
    void parseRSS(InputStream in, RSSListAdapter adapter) throws IOException,
            XmlPullParserException {
        XmlPullParser xpp = Xml.newPullParser();
        xpp.setInput(in, null);  // null = default to UTF-8

        int eventType;
        String title = "";
        String link = "";
        String description = "";
        eventType = xpp.getEventType();
        while (eventType != XmlPullParser.END_DOCUMENT) {
            if (eventType == XmlPullParser.START_TAG) {
                String tag = xpp.getName();
                if (tag.equals("item")) {
                    title = link = description = "";
                } else if (tag.equals("title")) {
                    xpp.next(); // Skip to next element -- assume text is directly inside the tag
                    title = xpp.getText();
                } else if (tag.equals("link")) {
                    xpp.next();
                    link = xpp.getText();
                } else if (tag.equals("description")) {
                    xpp.next();
                    description = xpp.getText();
                }
            } else if (eventType == XmlPullParser.END_TAG) {
                // We have a comlete item -- post it back to the UI
                // using the mHandler (necessary because we are not
                // running on the UI thread).
                String tag = xpp.getName();
                if (tag.equals("item")) {
                    RssItem item = new RssItem(title, link, description);
                    mHandler.post(new ItemAdder(item));
                }
            }
            eventType = xpp.next();
        }
    }
该方法是通过pull的方式解析xml文件,效率更高。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics