[color=green][size=medium]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显示。
方法附录:
1
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文件,效率更高。[/size][/color]
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显示。
方法附录:
1
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文件,效率更高。[/size][/color]