Java DOM4j不';我不能在安卓上工作
我尝试使用DOM4j在Android上分阶段创建一个xmlrss提要。我确实将dom4j.jar添加到lib\和用户权限Java DOM4j不';我不能在安卓上工作,java,android,xml,rss,dom4j,Java,Android,Xml,Rss,Dom4j,我尝试使用DOM4j在Android上分阶段创建一个xmlrss提要。我确实将dom4j.jar添加到lib\和用户权限 <uses-permission android:name="android.permission.INTERNET"/> 以下是主活动中的onCreate函数: @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceS
<uses-permission android:name="android.permission.INTERNET"/>
以下是主活动中的onCreate函数:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_rssdom4j_main);
try {
URL url = new URL("http://tw.news.yahoo.com/rss/");
SAXReader saxReader = new SAXReader();
//?
Document document = saxReader.read(url);
Element channel = (Element) document.getRootElement().element(
"channel");
for (Iterator i = channel.elementIterator("item"); i.hasNext();) {
Element element = (Element) i.next();
System.out.println("title: " + element.elementText("title"));
String descrip_original = element.elementText("description");
if (descrip_original.startsWith("<p>")) {
// address html-like layout
System.out.println(descrip_original.substring(
descrip_original.indexOf("</a>") + 4,
descrip_original.length() - 1));
}
System.out.println("link: " + element.elementText("link"));
System.out
.println("pubDate: " + element.elementText("pubDate"));
System.out.println();
}
} catch (Exception e) {
e.printStackTrace();
}
}
您正在通过主UI线程访问internet。这是安卓4.0.x以来的禁忌。将访问网络的代码放在AsyncTask中,或为其启动一个新线程
new Thread( new Runnable() {
@Override
public void run() {
try {
URL url = new URL("http://tw.news.yahoo.com/rss/");
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(url);
Element channel = (Element) document.getRootElement().element(
"channel");
for (Iterator i = channel.elementIterator("item"); i.hasNext();) {
Element element = (Element) i.next();
System.out.println("title: " + element.elementText("title"));
String descrip_original = element.elementText("description");
if (descrip_original.startsWith("<p>")) {
// address html-like layout
System.out.println(descrip_original.substring(
descrip_original.indexOf("</a>") + 4,
descrip_original.length() - 1));
}
System.out.println("link: " + element.elementText("link"));
System.out
.println("pubDate: " + element.elementText("pubDate"));
System.out.println();
}
} catch (Exception e) {
e.printStackTrace();
}
}
} ).start();
new线程(new Runnable()){
@凌驾
公开募捐{
试一试{
URL=新URL(“http://tw.news.yahoo.com/rss/");
SAXReader SAXReader=新SAXReader();
documentdocument=saxReader.read(url);
元素通道=(元素)document.getRootElement().Element(
“渠道”);
for(迭代器i=channel.elementIterator(“项”);i.hasNext();){
Element=(Element)i.next();
System.out.println(“标题:”+element.elementText(“标题”);
字符串descripp_original=element.elementText(“描述”);
如果(用(“”)描述原始启动){
//解决类似html的布局问题
System.out.println(descripp_original.substring(
描述原始索引(“”+4,
描述原始长度()-1);
}
System.out.println(“链接:+element.elementText(“链接”);
系统输出
.println(“pubDate:+element.elementText”(“pubDate”);
System.out.println();
}
}捕获(例外e){
e、 printStackTrace();
}
}
}).start();
非常感谢,它很有效:)我还有一个问题。为什么我不能在另一个.java类中编写phasher,并在线程中调用RSSPhasher.parse()之类的方法呢?只要在主UI线程之外调用任何网络操作,就可以了。在SAX解析器解析输入流时,您需要小心使用它们。如果查询返回一个大数据集,read()
方法可能会返回,但随后的解析可能会再次访问网络。DOM解析器不会有这个问题,因为它们只需一次读取/构建,但当然,您对内存的要求更高。
SAXReader saxReader = new SAXReader();
new Thread( new Runnable() {
@Override
public void run() {
try {
URL url = new URL("http://tw.news.yahoo.com/rss/");
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(url);
Element channel = (Element) document.getRootElement().element(
"channel");
for (Iterator i = channel.elementIterator("item"); i.hasNext();) {
Element element = (Element) i.next();
System.out.println("title: " + element.elementText("title"));
String descrip_original = element.elementText("description");
if (descrip_original.startsWith("<p>")) {
// address html-like layout
System.out.println(descrip_original.substring(
descrip_original.indexOf("</a>") + 4,
descrip_original.length() - 1));
}
System.out.println("link: " + element.elementText("link"));
System.out
.println("pubDate: " + element.elementText("pubDate"));
System.out.println();
}
} catch (Exception e) {
e.printStackTrace();
}
}
} ).start();