在 Android 中调试 SAX 解析器处理程序时需要帮助
这些天我有一个非常好奇的问题困扰着我,我检查了代码的每个角落,没有发现任何错误,但是我的 sax 解析器类不断记录错误,我快疯了,这是怎么回事?有人可以帮助我吗?
MyHandler
public class MyHandler extends DefaultHandler
{
private boolean in_episode = false;
private boolean in_name = false;
private boolean in_link = false;
private boolean in_desc = false;
private boolean in_date = false;
private List<Episode> li;
private Episode episodes;
private StringBuffer buf=new StringBuffer();
/* 将转换成List<News>的XML数据回传 */
public List<Episode> getParsedData()
{
return li;
}
/* XML文件开始解析时调用此method */
@Override
public void startDocument() throws SAXException
{
li = new ArrayList<Episode>();
}
/* XML文件结束解析时调用此method */
@Override
public void endDocument() throws SAXException
{
}
/* 解析到Element的开头时调用此method */
@Override
public void startElement(String namespaceURI, String localName,
String qName, Attributes atts) throws SAXException
{
if (localName.equals("episode"))
{
this.in_episode = true;
/* 解析到item的开头时new一个News对象 */
episodes=new Episode();
}
else if (localName.equals("name"))
{
if(this.in_episode)
{
this.in_name = true;
}
}
else if (localName.equals("link"))
{
if(this.in_episode)
{
this.in_link = true;
}
}
else if (localName.equals("desc"))
{
if(this.in_episode)
{
this.in_desc = true;
}
}
else if (localName.equals("pubdate"))
{
if(this.in_episode)
{
this.in_date = true;
}
}
}
/* 解析到Element的结尾时调用此method */
@Override
public void endElement(String namespaceURI, String localName,
String qName) throws SAXException
{
if (localName.equals("episode"))
{
this.in_episode = false;
/* 解析到item的结尾时将News对象写入List中 */
li.add(episodes);
}
else if (localName.equals("name"))
{
if(this.in_episode)
{
/* 设定News对象的name */
episodes.setname(buf.toString().trim());
buf.setLength(0);
this.in_name = false;
}
}
else if (localName.equals("link"))
{
if(this.in_episode)
{
/* 设定News对象的link */
episodes.setLink(buf.toString().trim());
buf.setLength(0);
this.in_link = false;
}
}
else if (localName.equals("desc"))
{
if(in_episode)
{
/* 设定News对象的description */
episodes.setDesc(buf.toString().trim());
buf.setLength(0);
this.in_desc = false;
}
}
else if (localName.equals("pubdate"))
{
if(in_episode)
{
/* 设定News对象的pubDate */
episodes.setDate(buf.toString().trim());
buf.setLength(0);
this.in_date = false;
}
}
}
/* 取得Element的开头结尾中间夹的字符串 */
@Override
public void characters(char ch[], int start, int length)
{
if(this.in_episode)
{
/* 将char[]加入StringBuffer */
buf.append(ch,start,length);
}
}
}
我的 XML 文件
<item>
<episode id="1">
<name>1</name>
<link>http://111</link>
<desc>111</desc>
</episode>
<episode id="2">
<name>2</name>
<link>http://222</link>
<desc>222</desc>
</episode>
</item>
MyAdapter
public class MyAdapter extends BaseAdapter {
private LayoutInflater mInflater;
private List<Episode> items;
/* MyAdapter的建构子,传入两个参数 */
public MyAdapter(Context context,List<Episode> it)
{
/* 参数初始化 */
mInflater = LayoutInflater.from(context);
items = it;
}
/* 因继承BaseAdapter,需重写以下method */
@Override
public int getCount()
{
return items.size();
}
@Override
public Object getItem(int position)
{
return items.get(position);
}
@Override
public long getItemId(int position)
{
return position;
}
@Override
public View getView(int position,View convertView,ViewGroup par)
{
ViewHolder holder;
if(convertView == null)
{
/* 使用自定义的news_row作为Layout */
convertView = mInflater.inflate(R.layout.episode, null);
/* 初始化holder的text与icon */
holder = new ViewHolder();
holder.text = (TextView) convertView.findViewById(R.id.episode);
convertView.setTag(holder);
}
else
{
holder = (ViewHolder) convertView.getTag();
}
Episode tmpN=(Episode)items.get(position);
holder.text.setText(tmpN.getname());
return convertView;
}
/* class ViewHolder */
private class ViewHolder
{
TextView text;
}
}
My Class 调用 SaxParser
private List<Episode> getRss(String path)
{
List<Episode> data=new ArrayList<Episode>();
URL url = null;
try
{
url = new URL(path);
Log.d("Showlist", "getRSS path " + path);
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
Log.d("Showlist", "Reader ok");
XMLReader xr = sp.getXMLReader();
/* 设定自定义的MyHandler给XMLReader */
MyHandler myExampleHandler = new MyHandler();
xr.setContentHandler(myExampleHandler);
Log.d("Showlist", "Handler attached");
xr.parse(new InputSource(url.openStream()));
Log.d("Showlist", "RSScontent ok");
data =myExampleHandler.getParsedData();
Log.d("Showlist", "DataRead ok");
}
catch (Exception e)
{
Log.e("showlist", "getRSS exception");
}
return data;
}
问题是,我运行了程序,logcat 不断记录 getRSS 异常,列表视图什么也不显示。
12-05 04:47:02.130: INFO/ActivityManager(58): 显示的活动 com.appkon.hdtvs/.HDtvs: 10008 毫秒(总计 8324825 毫秒) 12-05 04:47:02.150: WARN/ActivityManager(58): HistoryRecord{44d867b8 com.appkon.hdtvs/.HDtvs} 的活动空闲超时 12-05 04:47:07.560:DEBUG/dalvikvm(205):GC 在 193 毫秒内释放了 113 个对象/5056 字节 12-05 04:47:12.560:DEBUG/dalvikvm(103):GC 在 241 毫秒内释放了 2698 个对象/155704 字节 12-05 04:47:17.060: INFO/HDtvs(345): 路径 = http://appkon.com/hdtvs/channel/bigbang2.xml 12-05 04:47:17.081:INFO / ActivityManager(58):启动活动:意图{ cmp = com.appkon.hdtvs / .Showlist(有额外内容)} 12-05 04:47:17.501:DEBUG / Showlist(345):getRSS路径http://appkon.com/hdtvs/channel/bigbang2.xml 12-05 04:47:17.510:调试/显示列表(345):阅读器正常 12-05 04:47:17.520:调试/显示列表(345):已附加处理程序 12-05 04:47:19.700: 错误/showlist(345): getRSS 异常 12-05 04:47:19.700: INFO/Showlist(345): 路径 = http://appkon.com/hdtvs/channel/bigbang2.xml 12-05 04:47:19.730: INFO/showlist(345): dblink = http://movie.douban.com/subject/3190880/ 12-05 04:47:20.620:INFO/ActivityManager(58):显示的活动 com.appkon.hdtvs/.Showlist:3451 毫秒(总计 3451 毫秒)
I have this very curious problem bothering me thiese days and I checked every corner of my codes and find no error at all, but my sax parser class keep logging error, I am going mad,what's wrong with this? can anybody help me?
MyHandler
public class MyHandler extends DefaultHandler
{
private boolean in_episode = false;
private boolean in_name = false;
private boolean in_link = false;
private boolean in_desc = false;
private boolean in_date = false;
private List<Episode> li;
private Episode episodes;
private StringBuffer buf=new StringBuffer();
/* 将转换成List<News>的XML数据回传 */
public List<Episode> getParsedData()
{
return li;
}
/* XML文件开始解析时调用此method */
@Override
public void startDocument() throws SAXException
{
li = new ArrayList<Episode>();
}
/* XML文件结束解析时调用此method */
@Override
public void endDocument() throws SAXException
{
}
/* 解析到Element的开头时调用此method */
@Override
public void startElement(String namespaceURI, String localName,
String qName, Attributes atts) throws SAXException
{
if (localName.equals("episode"))
{
this.in_episode = true;
/* 解析到item的开头时new一个News对象 */
episodes=new Episode();
}
else if (localName.equals("name"))
{
if(this.in_episode)
{
this.in_name = true;
}
}
else if (localName.equals("link"))
{
if(this.in_episode)
{
this.in_link = true;
}
}
else if (localName.equals("desc"))
{
if(this.in_episode)
{
this.in_desc = true;
}
}
else if (localName.equals("pubdate"))
{
if(this.in_episode)
{
this.in_date = true;
}
}
}
/* 解析到Element的结尾时调用此method */
@Override
public void endElement(String namespaceURI, String localName,
String qName) throws SAXException
{
if (localName.equals("episode"))
{
this.in_episode = false;
/* 解析到item的结尾时将News对象写入List中 */
li.add(episodes);
}
else if (localName.equals("name"))
{
if(this.in_episode)
{
/* 设定News对象的name */
episodes.setname(buf.toString().trim());
buf.setLength(0);
this.in_name = false;
}
}
else if (localName.equals("link"))
{
if(this.in_episode)
{
/* 设定News对象的link */
episodes.setLink(buf.toString().trim());
buf.setLength(0);
this.in_link = false;
}
}
else if (localName.equals("desc"))
{
if(in_episode)
{
/* 设定News对象的description */
episodes.setDesc(buf.toString().trim());
buf.setLength(0);
this.in_desc = false;
}
}
else if (localName.equals("pubdate"))
{
if(in_episode)
{
/* 设定News对象的pubDate */
episodes.setDate(buf.toString().trim());
buf.setLength(0);
this.in_date = false;
}
}
}
/* 取得Element的开头结尾中间夹的字符串 */
@Override
public void characters(char ch[], int start, int length)
{
if(this.in_episode)
{
/* 将char[]加入StringBuffer */
buf.append(ch,start,length);
}
}
}
My XML file
<item>
<episode id="1">
<name>1</name>
<link>http://111</link>
<desc>111</desc>
</episode>
<episode id="2">
<name>2</name>
<link>http://222</link>
<desc>222</desc>
</episode>
</item>
MyAdapter
public class MyAdapter extends BaseAdapter {
private LayoutInflater mInflater;
private List<Episode> items;
/* MyAdapter的建构子,传入两个参数 */
public MyAdapter(Context context,List<Episode> it)
{
/* 参数初始化 */
mInflater = LayoutInflater.from(context);
items = it;
}
/* 因继承BaseAdapter,需重写以下method */
@Override
public int getCount()
{
return items.size();
}
@Override
public Object getItem(int position)
{
return items.get(position);
}
@Override
public long getItemId(int position)
{
return position;
}
@Override
public View getView(int position,View convertView,ViewGroup par)
{
ViewHolder holder;
if(convertView == null)
{
/* 使用自定义的news_row作为Layout */
convertView = mInflater.inflate(R.layout.episode, null);
/* 初始化holder的text与icon */
holder = new ViewHolder();
holder.text = (TextView) convertView.findViewById(R.id.episode);
convertView.setTag(holder);
}
else
{
holder = (ViewHolder) convertView.getTag();
}
Episode tmpN=(Episode)items.get(position);
holder.text.setText(tmpN.getname());
return convertView;
}
/* class ViewHolder */
private class ViewHolder
{
TextView text;
}
}
My Class which call the SaxParser
private List<Episode> getRss(String path)
{
List<Episode> data=new ArrayList<Episode>();
URL url = null;
try
{
url = new URL(path);
Log.d("Showlist", "getRSS path " + path);
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
Log.d("Showlist", "Reader ok");
XMLReader xr = sp.getXMLReader();
/* 设定自定义的MyHandler给XMLReader */
MyHandler myExampleHandler = new MyHandler();
xr.setContentHandler(myExampleHandler);
Log.d("Showlist", "Handler attached");
xr.parse(new InputSource(url.openStream()));
Log.d("Showlist", "RSScontent ok");
data =myExampleHandler.getParsedData();
Log.d("Showlist", "DataRead ok");
}
catch (Exception e)
{
Log.e("showlist", "getRSS exception");
}
return data;
}
the problem is ,I ran the program and the logcat keep logging getRSS exception and the listview shows nothing.
12-05 04:47:02.130: INFO/ActivityManager(58): Displayed activity com.appkon.hdtvs/.HDtvs: 10008 ms (total 8324825 ms) 12-05 04:47:02.150: WARN/ActivityManager(58): Activity idle timeout for HistoryRecord{44d867b8 com.appkon.hdtvs/.HDtvs} 12-05 04:47:07.560: DEBUG/dalvikvm(205): GC freed 113 objects / 5056 bytes in 193ms 12-05 04:47:12.560: DEBUG/dalvikvm(103): GC freed 2698 objects / 155704 bytes in 241ms 12-05 04:47:17.060: INFO/HDtvs(345): path = http://appkon.com/hdtvs/channel/bigbang2.xml 12-05 04:47:17.081: INFO/ActivityManager(58): Starting activity: Intent { cmp=com.appkon.hdtvs/.Showlist (has extras) } 12-05 04:47:17.501: DEBUG/Showlist(345): getRSS path http://appkon.com/hdtvs/channel/bigbang2.xml 12-05 04:47:17.510: DEBUG/Showlist(345): Reader ok 12-05 04:47:17.520: DEBUG/Showlist(345): Handler attached 12-05 04:47:19.700: ERROR/showlist(345): getRSS exception 12-05 04:47:19.700: INFO/Showlist(345): path = http://appkon.com/hdtvs/channel/bigbang2.xml 12-05 04:47:19.730: INFO/showlist(345): dblink = http://movie.douban.com/subject/3190880/ 12-05 04:47:20.620: INFO/ActivityManager(58): Displayed activity com.appkon.hdtvs/.Showlist: 3451 ms (total 3451 ms)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
对于调试过程中的未来帮助:
您需要打印确切的堆栈跟踪以了解发生了什么
,或者
至于您面临的问题,可能是因为您尝试读取的 xml 文件有 404-ed
For future help during debugging :
You need to print the exact stack trace to know what's going on
or
As for the problem you are facing, it is probably because the xml file you are trying to read has 404-ed