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

        通过浏览器访问下面的链接:
      
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
        虚拟机在这两个平台都能正常运行。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值