android - XMLPullParser 在 Android 中的异步任务错误中从互联网解析

标签 android xml android-asynctask xmlpullparser

我正在 Android 系统上开发一个应用程序,其中涉及解析一些 xml 内容。问题是程序崩溃了,我还没有发现问题所在。我有一个 Activity,它有一个扩展 asynctask 的私有(private)类。这是代码:

URL url = new URL(XML_INIT_ADRESS);
XmlPullParser xpp =  XmlPullParserFactory.newInstance().newPullParser();
xpp.setInput(url.openConnection().getInputStream(), null);

int pullParserState = xpp.getEventType();

while (pullParserState != XmlPullParser.END_DOCUMENT){
    if (xpp.getName().equals("signupclients") && pullParserState == XmlPullParser.START_TAG){ //Error!!!               
        while(!xpp.getName().equals("signupclients") && pullParserState != XmlPullParser.END_TAG){
            if (xpp.getName().equals("client")) {
                clientNames.add(xpp.getAttributeValue(0));
            }
            pullParserState = xpp.next();
        }
        pullParserState = xpp.next();
    }
}    

如您所见,我已经对第一个 if 语句进行了注释,如果您将其注释掉,那么包含该代码的代码将起作用。我可以补充说它在 Eclipse 中并且我捕获了所有错误。

String XML_INIT_ADRESS = "http://www.johanstenberg.se/tests/app/start.xml"

它应该是一个有效的 XML 文档。请帮忙,因为我一无所知,但我想看到它与 XMLPullParser 一起工作。我这样调用 onCreate() 方法中的异步任务:

new UpdateDatabase().execute();

其中 UpdateDatabase 是扩展 Asynctask 的私有(private)类的名称。

提前致谢!

日志:

12-05 18:38:43.664: W/KeyCharacterMap(525): No keyboard for id 0
12-05 18:38:43.664: W/KeyCharacterMap(525): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
12-05 18:38:44.854: I/AndroidRuntime(525): AndroidRuntime onExit calling exit(0)
12-05 18:38:45.154: D/dalvikvm(535): GC freed 750 objects / 54888 bytes in 51ms
12-05 18:38:45.584: W/dalvikvm(535): threadid=15: thread exiting with uncaught exception (group=0x4001b188)
12-05 18:38:45.594: E/AndroidRuntime(535): Uncaught handler: thread AsyncTask #1 exiting due to uncaught exception
12-05 18:38:45.604: E/AndroidRuntime(535): java.lang.RuntimeException: An error occured while executing doInBackground()
12-05 18:38:45.604: E/AndroidRuntime(535):  at android.os.AsyncTask$3.done(AsyncTask.java:200)
1    2-05 18:38:45.604: E/AndroidRuntime(535):  at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
12-05 18:38:45.604: E/AndroidRuntime(535):  at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
12-05 18:38:45.604: E/AndroidRuntime(535):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
12-05 18:38:45.604: E/AndroidRuntime(535):  at java.util.concurrent.FutureTask.run(FutureTask.java:137)
12-05 18:38:45.604: E/AndroidRuntime(535):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
12-05 18:38:45.604: E/AndroidRuntime(535):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
12-05 18:38:45.604: E/AndroidRuntime(535):  at java.lang.Thread.run(Thread.java:1096)
12-05 18:38:45.604: E/AndroidRuntime(535): Caused by: java.lang.NullPointerException
12-05 18:38:45.604: E/AndroidRuntime(535):  at com.discountapp.johanaugust.UpdatingDB$UpdateDatabase.doInBackground(UpdatingDB.java:119)
12-05 18:38:45.604: E/AndroidRuntime(535):  at com.discountapp.johanaugust.UpdatingDB$UpdateDatabase.doInBackground(UpdatingDB.java:1)
12-05 18:38:45.604: E/AndroidRuntime(535):  at android.os.AsyncTask$2.call(AsyncTask.java:185)
12-05 18:38:45.604: E/AndroidRuntime(535):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
12-05 18:38:45.604: E/AndroidRuntime(535):  ... 4 more
12-05 18:38:45.654: I/dalvikvm(535): threadid=7: reacting to signal 3
12-05 18:38:45.654: E/dalvikvm(535): Unable to open stack trace file '/data/anr/traces.txt': Permission denied

最佳答案

如果您从这一行得到异常:

if(xpp.getName().equals("signupclients") && pullParserState == XmlPullParser.START_TAG)

那么我最好的猜测是 xpp.getName() 返回 null,而您正在尝试从该 null 引用调用 .equals()

在尝试对其进行操作之前,您应该检查 XmlPullParser 中的 eventType。看看 JavaDoc 中的这个 fragment :

         int eventType = xpp.getEventType();
         while (eventType != XmlPullParser.END_DOCUMENT) {
          if(eventType == XmlPullParser.START_DOCUMENT) {
              System.out.println("Start document");
          } else if(eventType == XmlPullParser.START_TAG) {
              System.out.println("Start tag "+xpp.getName());
          } else if(eventType == XmlPullParser.END_TAG) {
              System.out.println("End tag "+xpp.getName());
          } else if(eventType == XmlPullParser.TEXT) {
              System.out.println("Text "+xpp.getText());
          }
          eventType = xpp.next();
         }

如果没有更多细节(如堆栈跟踪),很难给出更明确的答案。

关于android - XMLPullParser 在 Android 中的异步任务错误中从互联网解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8389151/

相关文章:

android - 如何在一个 Activity 中运行两个 AsyncTasks?

android - MPAndroidChart:XAxis 值与数据值不对应

java - 在 Android 中使用锅炉管

java - DOM:如何读取子节点?

java - 在 Jaxb 中使用具有相同名称的不同标签进行解码

android - 在Android中执行两个asynctask实例

Android 应用签名机制

android - 访问 Java 文件中的 Android View

java - 在 Android 中使用 XML 设置启动 AccessibilitySettings

android - extends AsyncTask<Void, Void, Long> 是如何工作的