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") ; }
参考文章: