Android 3.1 Xml解析NullPointerException

Android 3.1 Xml解析NullPointerException,android,xml,multithreading,android-3.0-honeycomb,Android,Xml,Multithreading,Android 3.0 Honeycomb,我已经为Android2.2编写了代码,它应该将网页中的xml解析为字符串。它在Android2.2模拟器上运行良好,但在我的Android3.1平板电脑上给了我一个NullPointerException。代码如下: Log.d("refreshMeta", "refreshing meta."); url = new URL("http://www.chineseoutreach.ca/media/Cstreaming.xml"); URLCo

我已经为Android2.2编写了代码,它应该将网页中的xml解析为字符串。它在Android2.2模拟器上运行良好,但在我的Android3.1平板电脑上给了我一个NullPointerException。代码如下:

Log.d("refreshMeta", "refreshing meta.");
            url = new URL("http://www.chineseoutreach.ca/media/Cstreaming.xml");
            URLConnection connection;
            connection = url.openConnection();

            HttpURLConnection httpConnection = (HttpURLConnection)connection;
            int responseCode = httpConnection.getResponseCode();

            if (responseCode == HttpURLConnection.HTTP_OK) {
                InputStream in = httpConnection.getInputStream();
                Log.d("Connection","connected");
                DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
                DocumentBuilder db = dbf.newDocumentBuilder();

                Document dom = db.parse(in);
                Element docEle = dom.getDocumentElement();
                NodeList nl = docEle.getElementsByTagName("nowplaying");
                Element entry = (Element)nl.item(0);

                try {
                    Element eartist = (Element)entry.getElementsByTagName("artist").item(0);
                sartist = eartist.getFirstChild().getNodeValue();
                Log.d("Artist",sartist);
                }
                catch(NullPointerException e) {
                    sartist = "";
                    Log.d("Connection",e.toString());
                }
登录Android 3:

刷新元数据:刷新元数据

连接:已连接

连接:java.lang.NullPointerException

编辑 这是导致它的原因。 元素eartist=Elemententry.getelementsbytagnameartister.item0

编辑2

07-28 13:10:01.483:错误/空6189:我的消息

07-28 13:10:01.483:错误/Null6189:java.lang.NullPointerException

07-28 13:10:01.483:ERROR/Null6189:com.ciam.app.CiamInfoActivity.refreshMetaCiamInfoActivity.java:280

07-28 13:10:01.483:ERROR/Null6189:com.ciam.app.CiamInfoActivity.access$0CiamInfoActivity.java:257

07-28 13:10:01.483:ERROR/Null6189:com.ciam.app.CiamInfoActivity$2.runCiamInfoActivity.java:123 07-28 13:10:01.483:ERROR/Null6189:at java.lang.Thread.runThread.java:1020


我怀疑在Android2和Android3上解析xml的方式有一些不同。有什么想法吗?提前谢谢。

我不完全确定,但可能需要对链接做些什么,因为它可以建立连接,但找不到文件。。。如果可以找到url指向的xml,请尝试进行日志记录


如果找不到该文件,请尝试删除.xml扩展名,也许它可以工作。

代码中有一个小错误。我真的不明白为什么它要与android 2.1 emu一起工作,但它不应该这样做。您的问题是您正在执行dom.getDocumentElement。该函数将返回xml文件的基本标记,在本例中,该标记正在播放。然后你正在做一个docEle.getelementsbytagnameowplaying;在那上面

如果要确保立即开始播放,必须执行dom.getElementsByTagnameowPlaying

更正版本:

Document dom = db.parse(in);
Element docEle = (Element)dom.getElementsByTagName("nowplaying").item(0);
Element eartist = (Element)docEle.getElementsByTagName("artist").item(0);
Element etitle = (Element)docEle.getElementsByTagName("title").item(0);
Log.d("Artist", eartist.getTextContent());
Log.d("Title", etitle.getTextContent());

我遇到了类似的问题,偶然发现了这一页。 根据我的观察,getElementsByTagName的行为在不同的android版本中是不同的

在第2版中,如果结果具有指定的标记,则包含其自身。在您的例子中,我猜变量docEle现在正在播放标签,因此它工作正常

在版本3中,结果仅从子代中搜索,因此它不包含自身docEle。所以nl真的是空的

根据规范,版本3似乎是预期的行为。
这似乎很关键,但没有人提到这一点。或者,我可能错了…

不要使用log.d在catch块中登录。使用Log.eLOG_标记,我的消息,例如。然后,您将看到一个堆栈跟踪,其中显示了哪一行将其删除…删除xml扩展:没有效果。此外,这不是主要问题,只是一些代码在3.0上不起作用。如果一开始它是空的,那么它早就抛出了NPE。没错,我自己在平板电脑上使用了domparser,在资产中使用了一个本地xml文件,它按照我的预期工作。。。因此,我不确定问题出在哪里。似乎与按标记名获取元素有关。我将尝试在模拟环境中运行它,我想它也可能与我正在运行的线程有关。。。我正在3.0模拟器中检查代码。