Android Java中的URL解析出现异常

时间:2013-11-20 14:15:43

标签: java android parsing

在我的应用程序中,我想解析天气xml api,但在解析api的URL时会出现异常。这是logcat的屏幕截图。

enter image description here

从logcat观察中,异常出现在第654行,我在第654行有xr.parse(new InputSource(url.openStream()));语句但是,我不知道如何解决问题。你可以查看下面代码中的语句。请帮助我这方面。您的回复将受到高度赞赏。提前谢谢。

这是我的代码。

private void parseWeatherURL(String strURL)
 {
     try
     {
         String weatherURL="http://api.worldweatheronline.com/free/v1/weather.ashx?key=476yv2t87x67j5pzb7hbazn6&q=34.25,71.014&cc=yes&num_of_days=5&format=xml";
         /* Replace blanks with HTML-Equivalent. */ 
         URL url = new URL(weatherURL.replace(" ", "%20"));
         Log.e("Weather", "URL");   

        /* Get a SAXParser from the SAXPArserFactory. */
        SAXParserFactory spf = SAXParserFactory.newInstance();
        SAXParser sp = spf.newSAXParser();
        Log.e("Weather", "SAX");

        /* Get the XMLReader of the SAXParser we created. */
        XMLReader xr = sp.getXMLReader();

        com.ifahja.weather.WeatherHandler myWeatherHandler = new com.ifahja.weather.WeatherHandler();
        xr.setContentHandler(myWeatherHandler);
        Log.e("Weather", "Handler");
        /* Parse the xml-data our URL-call returned. */
        xr.parse(new InputSource(url.openStream()));

        //Log.d(TAG, "it's all right");

        Log.e("Weather URL", "it's all right");

     }
     catch(Exception e)
     {
         Log.e("Problem", "parseWeatherURL()");
         e.printStackTrace();
     }
 }

2 个答案:

答案 0 :(得分:1)

您是在UI线程之外进行网络呼叫吗?因为你有NetworkOnMainThreadException ...

如果没有,请使用AsyncTask。例如:

或者

您可以使用 Android异步Http客户端库。非常简单的库,小尺寸(25kb),易于使用和异步。代码将类似于:

AsyncHttpClient client = new AsyncHttpClient();
client.get("http://www.dfsdfsdfsdfsd.com", new AsyncHttpResponseHandler() {
    @Override
    public void onSuccess(String response) {
      // Here is your content !
    }
});

可用here


否则,您可能希望将呼叫切换为单独呼叫并检查空值

URLConnection urlcon = url.openConnection();
urlcon.setReadTimeout(10000);
InputStream is = urlcon.getInputStream();

答案 1 :(得分:0)

您无法在主UI线程上进行此调用。尝试创建AsyncTask,然后调用其中的方法。 http://developer.android.com/reference/android/os/AsyncTask.html