博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Android]天气App 3 网络数据的请求和Json解析
阅读量:4617 次
发布时间:2019-06-09

本文共 3588 字,大约阅读时间需要 11 分钟。

  Android客户端开发,不仅仅是在Android端开发,还需要有相应的后台服务支持,否则的话,客户端的数据就只能放到本地自己做处理。我认为的原生态的App就是对应服务端的Client。他能像浏览器那样可以请求服务端的数据,也可以在本地做简单的处理,所以我们在开发WeathApp这个项目中,我们也是需要请求第一章中的天气网中的数据。

  如何请求数据呢,举个例子:

打开,发现页面的数据是为:

{    "weatherinfo": {        "city": "北京",        "cityid": "101010100",        "temp": "18",        "WD": "东风",        "WS": "3级",        "SD": "48%",        "WSE": "3",        "time": "11:40",        "isRadar": "1",        "Radar": "JC_RADAR_AZ9010_JB"    }}

客户端怎么做怎么能像浏览器一样打开这个连接呢?

数据的请求

有两种方式可以选择:

  • HttpURLConnection
  • HttpClient

HttpURLConnection使用

1.HttpURLConnection连接URL

     1)创建一个URL对象

            URL url = new URL();

     2)利用HttpURLConnection对象从网络中获取网页数据

             HttpURLConnection conn = (HttpURLConnection) url.openConnection();

    3)设置连接超时

            conn.setConnectTimeout(6*1000);

     4)对响应码进行判断

         if (conn.getResponseCode() != 200)    //从Internet获取网页,发送请求,将网页以流的形式读回来

               throw new RuntimeException("请求url失败");

     5)得到网络返回的输入流

          InputStream is = conn.getInputStream();

      6)String result = readData(is, "GBK"); //文件流输入出文件用outStream.write

     7)conn.disconnect();

注意:
     --记得设置连接超时,如果网络不好,Android系统在超过默认时间会收回资源中断操作.
     --返回的响应码200,是成功.
     --在Android中对文件流的操作和JAVA SE上面是一样的.
    --在对大文件的操作时,要将文件写到SDCard上面,不要直接写到手机内存上.
    --操作大文件是,要一遍从网络上读,一遍要往SDCard上面写,减少手机内存的使用.这点很重要,面试经常会被问到.
    --对文件流操作完,要记得及时关闭.

2 HttpClient

1.使用DefaultHttpClient类实例化HttpClient对象

       DefaultHttpClient httpClient = new DefaultHttpClient();

2.创建HttpGet或HttpPost对象,将要请求的URL通过构造方法传入HttpGet或HttpPost对象,也可以根据需要添加可选的请求参数如cookie,语言,超时间等。

HttpGet httpRequest = new HttpGet(url);          HttpParams params = httpClient.getParams();         HttpConnectionParams.setConnectionTimeout(params, timeoutMillis);         HttpConnectionParams.setSoTimeout(params, timeoutMillis);         CookieManager cookieManager = CookieManager.getInstance();         String cookie = cookieManager.getCookie(url);         httpRequest.addHeader("Cookie", cookie);

3.调用execute方法发送HTTP GET或HTTP POST请求,并返回HttpResponse对象。

4.通过HttpResponse接口的getEntity方法返回响应信息,并进行相应的处理。

HttpResponse httpResponse;		try {			httpResponse = httpClient.execute(httpRequest);			if (httpResponse.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {				L.e("url:" + url + " status:" + httpResponse.getStatusLine());			}			if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {				return EntityUtils.toString(httpResponse.getEntity(), HTTP.UTF_8);			}		} catch (ClientProtocolException e) {			e.printStackTrace();			httpRequest.abort();		}

Json数据解析

   Json是一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性。业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语言的支持),从而可以在不同平台间进行数据交换。JSON采用兼容性很高的文本格式,同时也具备类似于C语言体系的行为。 – Json.org

android2.3提供的json解析类

android的json解析部分都在包org.json下,主要有以下几个类:

    JSONObject

    JSONStringer:json文本构建类 ,根据官方的解释,这个类可以帮助快速和便捷的创建JSON text。

   JSONArray:它代表一组有序的数值。

  JSONException:json中用到的异常

上面的Json数据就可以这么解析:

JSONObject weatherRoot = new JSONObject(curWeacherStr);        JSONObject jsonWeath= weatherRoot.optJSONObject("weatherinfo");			if(jsonWeath!=null){             String cityName = jsonWeath.optString("city") ;	          String cityId   = jsonWeath.optString("cityid") ;	         String temp1    = jsonWeath.optString("temp1") ;	         String temp2    = jsonWeath.optString("temp2") ;	         String weather  = jsonWeath.optString("weather") ;	         String img1     = jsonWeath.optString("img1") ;	         String img2     = jsonWeath.optString("img2") ;	         String pubTime  = jsonWeath.optString("time") ;	         String winDir   = getValue(jsonWeath, "wd", "WD");	         String winSize  = getValue(jsonWeath, "ws", "WS");	         String sm       = jsonWeath.optString("sm") ;			}

参考文章:

转载于:https://www.cnblogs.com/Cyning/p/3635455.html

你可能感兴趣的文章
linux 命令-case
查看>>
Fragment
查看>>
测试工资那点事儿
查看>>
0723------Linux基础----------文件 IO 之 dup、dup2 和 fcntl 函数
查看>>
【MySQL技巧】定制你的MySQL命令行
查看>>
长春理工大学第十四届程序设计竞赛(重现赛)F
查看>>
Centos7/RHEL7 开启kdump
查看>>
最长回文子串之Manacher算法
查看>>
08.总结
查看>>
Struts2实现文件上传
查看>>
14中程序员性格
查看>>
【HDU4622】Reincarnation
查看>>
花点时间搞清top、clientTop、scrollTop、offsetTop
查看>>
python辅助开发模块(非官方)如pil,mysqldb,openpyxl,xlrd,xlwd
查看>>
Mybatis 查询tinyint(1)的数据库字段时会自动转换成boolean类型
查看>>
easyui tree 模仿ztree 使用扁平化加载json
查看>>
JDBC -- DBUtils
查看>>
linux小知识之grub配置
查看>>
[转]Fedora22添加国内软件源和本地软件源
查看>>
安装svn插件最快速,最简单的方法
查看>>