我是Android初学者我正在尝试解析RSS源并存储标题和链接标记中的文本。
我正在使用XMLPullParser,我试图只提取项目标签之间的数据。
AsycTask抛出一个运行时错误,我无法弄清楚可能导致它的原因。
任何帮助都会非常感激。
代码
package com.example.simplerssreader;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;
import android.app.ListActivity;
import android.content.Intent;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
public class MainActivity extends ListActivity {
List<String> headlines;
List<String>links;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Initializing instance variables
headlines = new ArrayList<String>();
links = new ArrayList<String>();
new XmlParserTask().execute("http://feeds.pcworld.com/pcworld/latestnews");
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, headlines);
setListAdapter(adapter);
}
public InputStream getInputStream(URL url) {
try {
return url.openConnection().getInputStream();
} catch (IOException e) {
return null;
}
}
public class XmlParserTask extends AsyncTask <String, Void, Void>
{
@Override
protected Void doInBackground(String... urls) {
try{
URL url = new URL(urls[0]);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(10000 /* milliseconds */);
conn.setConnectTimeout(15000 /* milliseconds */);
conn.setRequestMethod("GET");
conn.setDoInput(true);
InputStream stream = conn.getInputStream();
// Starts the query
conn.connect();
XmlPullParserFactory xmlFactoryObject;
xmlFactoryObject = XmlPullParserFactory.newInstance();
XmlPullParser myParser = xmlFactoryObject.newPullParser();
myParser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
myParser.setInput(stream, null);
int event;
String text=null;
boolean insideItem =false;
event = myParser.getEventType();
while (event != XmlPullParser.END_DOCUMENT) {
if(myParser.getName().equals("item"))
{
insideItem = true;
}
String name=myParser.getName();
switch (event){
case XmlPullParser.START_TAG:
break;
case XmlPullParser.TEXT:
text = myParser.getText();
break;
case XmlPullParser.END_TAG:
if(name.equals("title") ){
if(insideItem == true){
headlines.add(text);
}
}
else if(name.equals("link") ){
if(insideItem==true)
{
links.add(text);
}
}
else{
}
break;
}
if(myParser.getName().equals("item"))
{
insideItem = false;
}
event = myParser.next();
}
} catch (XmlPullParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
}
logcat的
04-29 16:52:02.140: D/dalvikvm(1270): GC_FOR_ALLOC freed 58K, 5% free 2948K/3092K, paused 49ms, total 50ms
04-29 16:52:02.140: I/dalvikvm-heap(1270): Grow heap (frag case) to 3.562MB for 635812-byte allocation
04-29 16:52:02.250: D/dalvikvm(1270): GC_FOR_ALLOC freed 2K, 5% free 3566K/3716K, paused 58ms, total 58ms
04-29 16:52:02.560: I/Choreographer(1270): Skipped 47 frames! The application may be doing too much work on its main thread.
04-29 16:52:02.650: D/gralloc_goldfish(1270): Emulator without GPU emulation detected.
04-29 16:52:04.880: W/dalvikvm(1270): threadid=11: thread exiting with uncaught exception (group=0xb2a5dba8)
04-29 16:52:04.910: E/AndroidRuntime(1270): FATAL EXCEPTION: AsyncTask #1
04-29 16:52:04.910: E/AndroidRuntime(1270): Process: com.example.simplerssreader, PID: 1270
04-29 16:52:04.910: E/AndroidRuntime(1270): java.lang.RuntimeException: An error occured while executing doInBackground()
04-29 16:52:04.910: E/AndroidRuntime(1270): at android.os.AsyncTask$3.done(AsyncTask.java:300)
04-29 16:52:04.910: E/AndroidRuntime(1270): at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
04-29 16:52:04.910: E/AndroidRuntime(1270): at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
04-29 16:52:04.910: E/AndroidRuntime(1270): at java.util.concurrent.FutureTask.run(FutureTask.java:242)
04-29 16:52:04.910: E/AndroidRuntime(1270): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
04-29 16:52:04.910: E/AndroidRuntime(1270): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
04-29 16:52:04.910: E/AndroidRuntime(1270): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
04-29 16:52:04.910: E/AndroidRuntime(1270): at java.lang.Thread.run(Thread.java:841)
04-29 16:52:04.910: E/AndroidRuntime(1270): Caused by: java.lang.NullPointerException
04-29 16:52:04.910: E/AndroidRuntime(1270): at com.example.simplerssreader.MainActivity$XmlParserTask.doInBackground(MainActivity.java:99)
04-29 16:52:04.910: E/AndroidRuntime(1270): at com.example.simplerssreader.MainActivity$XmlParserTask.doInBackground(MainActivity.java:1)
04-29 16:52:04.910: E/AndroidRuntime(1270): at android.os.AsyncTask$2.call(AsyncTask.java:288)
04-29 16:52:04.910: E/AndroidRuntime(1270): at java.util.concurrent.FutureTask.run(FutureTask.java:237)
04-29 16:52:04.910: E/AndroidRuntime(1270): ... 4 more
04-29 16:57:05.340: I/Process(1270): Sending signal. PID: 1270 SIG: 9
答案 0 :(得分:0)
public abstract String getName()
对于START_TAG或END_TAG事件,启用名称空间时将返回当前元素的(本地)名称。禁用名称空间处理时,将返回原始名称。对于ENTITY_REF事件,将返回实体名称。如果当前事件不是START_TAG,END_TAG或ENTITY_REF,则返回null。
所以,你肯定不在START_TAG
或END_TAG
。由于您尚未开始处理,我的猜测是您已经使用START_DOCUMENT
标记了,这就是为什么它会抛出该异常。您必须检查您要避免此异常的状态。