使用SAX解析XML利用Google Weather服务制作天气预报异常解决办法

来源:互联网 发布:一千零一夜 淘宝 视频 编辑:程序博客网 时间:2024/06/06 00:28

        通过浏览器访问下面的链接:
      
http://www.google.com/ig/api?weather=nanchang 或http://www.google.com/ig/api?hl=zh-cn&weather=nanchang

       http://www.google.com/ig/api?hl=en&weather=nanchang

       http://www.google.com/ig/api?hl=zh-tw&weather=nanchang

       可以分别获得Google Weather API服务提供某个城市的天气信息(简体中文,英文,繁体中文),然后利用SAX解析XML即可取得所包含的数据。

       在《深入浅出Google Android》,《Android核心技术与实例详解》中都有天气预报实例讲解,在此只是列出主要思路代码。

       新建继承自DefaultHandler的类WeatherHandler,该类主要功能是对XML文件中的内在进行提取。

       Activity类按钮主要代码如下:

       try{
               String urlStr = "
http://www.google.com/ig/api?weather=" + sCity;
               urlStr = urlStr.replace(" ", "%20");  //替换空格为 %20
               URL weatherUrl = new URL(urlStr); 

               SAXParserFactory sf = SAXParserFactory.newInstance(); //创建SAXParserFactory对象
               SAXParser sp = sf.newSAXParser();   //创建SAXParser对象
               XMLReader xr = sp.getXMLReader();   //获得XMLReader对象
               WeatherHandler wh = new WeatherHandler(); //创建解析XML内容的WeatherHandler对象
               xr.setContentHandler(wh); 

               xr.parse(new InputSource(weatherUrl.openStream())); //解析XML文件

               StringBuilder sb = new StringBuilder();
               sb.append(wh.getMain_condition());
               sb.append("\n");
               sb.append(wh.getTemprature());
               sb.append("\n");
               sb.append(wh.getHumidity());
               sb.append("\n");
               sb.append(wh.getWind());
               TextView tv = (TextView)findViewById(R.id.tvResult);
               tv.setText(sb.toString());
   
               URL iconUrl = new URL("
http://www.google.com"+wh.getIcon()); //生成图片路径
               URLConnection con = iconUrl.openConnection();
               InputStream in = con.getInputStream();
               Bitmap bmp = BitmapFactory.decodeStream(in);
               ImageView iv = (ImageView)findViewById(R.id.ivResult); //获得ImageView对象
               iv.setImageBitmap(bmp); 
         }
        catch(Exception e){
               Log.e("URL_PParse_ERROR", e.toString());
        }

        最终程序运行如下图:

       

       在开发过程中可能会遇到如下问题

        1,android.os.NetworkOnMainThreadException异常

        该异常是由于在主线程中做了网络操作。在3.0的版本上访问网络不能在主线程内,要不就抛异常,必须自己写一个thread,把代码写进thread里面。或者在主Activity类的OnCreate方法中添加如下代码:

        StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
       .detectDiskReads()
       .detectDiskWrites()
       .detectNetwork()
       .penaltyLog()
       .build());
        StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
       .detectLeakedSqlLiteObjects()
       .detectLeakedClosableObjects()
       .penaltyLog()
       .penaltyDeath()
       .build());

        2,java.net.UnknownHostException异常

        这是由于AndroidMainifest.xml中未加入INTERNET权限引起的,代码如下:

        <uses-permission android:name="android.permission.INTERNET"/>

        3,org.apache.harmony.xml.expatParser$ParseException异常

        在该应用中若想获得中文信息,可能会把String urlStr = "http://www.google.com/ig/api?weather=" + sCity;修改为:

        String urlStr = "http://www.google.com/ig/api?hl=zh-cn&weather=" + sCity;,然而解析时出现异常。可以考虑自己编程开发相应的字符串替换方法对返回的英文信息进行翻译。

        4,Project Build Target不拘泥于Standard Android platform 4.0或Android+Google APIs
        虚拟机在这两个平台都能正常运行。

原创粉丝点击