android 网络请求+json解析 最优分析
2017-03-30 20:52
513 查看
最近在项目中使用到了网络请求,网页数据以 json的方式返回,所以也避免不了json解析。众所周知,android为防止UI 阻塞,所以耗时操作时候都需要用户异步的方式处理。虽然进行了异步处理,但是速度上还是应该尽可能快。最后分析得出–HttpURLConnection+GSON解析最优。
一: 网络请求 httpClient or HttpURLConnection
在Android 2.3及以上版本,使用的是HttpURLConnection,而在Android2.2及以下版本,使用的是HttpClient。至于为什么新版本为什么不推荐使用,则是谷歌对其不怎么更新,支持不太高。
HttpURLConnection是一种多用途、轻量极的HTTP客户端,使用它来进行HTTP操作可以适用于大多数的应用程序。虽然HttpURLConnection的API提供的比较简单,但是同时这也使得我们可以更加容易地去使用和扩展它。
但是如果不是简单网页,比如需要登录后与服务器保持连接的话,还是推荐使用httpClient,通过set-cookies方式。
这些都是比较书面化的定义,在实际的项目中测试了一下速度。httpURLConnect会更快一些,毕竟是读取字节流的方式读取json信息。
二. JSON解析。
测试一个北京到上海的路径导航API网页数据,大约json里面坐标数组几万个,此时良好的解析方式将会凸显出性能的优劣。
我在处理json解析的时候用到三种方式;
第一种 传统android自带的解析方式,使用JSONObject 解析对象, JSONArray 解析数组。
第二种 阿里巴巴开源提供的fastjson.
第三种 谷歌提供的GSON。
实际在几万个数据的解析下 谷歌GSON解析更胜一筹,领先fastjson 几秒,最慢也是自带的 JSONObject .
最后附上GSON解析相关类。fastjson 和传统JSONObject 将不再赘述。
一: 网络请求 httpClient or HttpURLConnection
在Android 2.3及以上版本,使用的是HttpURLConnection,而在Android2.2及以下版本,使用的是HttpClient。至于为什么新版本为什么不推荐使用,则是谷歌对其不怎么更新,支持不太高。
HttpURLConnection是一种多用途、轻量极的HTTP客户端,使用它来进行HTTP操作可以适用于大多数的应用程序。虽然HttpURLConnection的API提供的比较简单,但是同时这也使得我们可以更加容易地去使用和扩展它。
但是如果不是简单网页,比如需要登录后与服务器保持连接的话,还是推荐使用httpClient,通过set-cookies方式。
这些都是比较书面化的定义,在实际的项目中测试了一下速度。httpURLConnect会更快一些,毕竟是读取字节流的方式读取json信息。
// httpClient Get public static String connServerResult(String strUrl) { // 请求服务器的URL地址 // 返回数据转换成String HttpGet httpRequest = new HttpGet(strUrl); String strResult = null; try { HttpClient httpClient = new DefaultHttpClient(); HttpResponse httpResponse = httpClient.execute(httpRequest); int code = httpResponse.getStatusLine().getStatusCode(); if (code == HttpStatus.SC_OK) { Log.v("lzw", "PoiSearch-connServerResult-1"); strResult = EntityUtils.toString(httpResponse.getEntity()); } } catch (Exception e) { } return strResult; } //httpURlConnect 采用回调方式处理异步事件 public static void getHttpResponse(final String allConfigUrl) { new Thread(new Runnable() { public void run() { BufferedReader in = null; StringBuffer result = null; HttpURLConnection connection = null; try { URL url = new URL(allConfigUrl); connection = (HttpURLConnection) url.openConnection(); connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); connection.setRequestProperty("Charset", "utf-8"); if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) { result = new StringBuffer(); // 读取URL的响应 in = new BufferedReader(new InputStreamReader(connection.getInputStream())); String line; while ((line = in.readLine()) != null) { result.append(line); } Message msg_navigation = mHandler.obtainMessage(); msg_navigation.what = 0; msg_navigation.obj = result.toString(); mHandler.sendMessage(msg_navigation); } } catch (Exception e) { e.printStackTrace(); } finally { try { if (connection != null) { connection.disconnect(); connection = null; } if (in != null) { in.close(); in = null; } } catch (Exception e2) { e2.printStackTrace(); } } } }).start(); } //执行回调函数,处理异步事件。 public static void doHttpUtilsCallBaockListener(final HttpUtilsCallbackListener listener) { mHandler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case 0: String str = (String) msg.obj; listener.success(str); break; default: break; } } }; } public interface HttpUtilsCallbackListener { void success(String str); }
经过上面两种方式,对我请求的一个路径导航的网页,httpClient大概3385ms httpURLConncet 2025ms。同等情况下 httpURLConnect性能更优。
二. JSON解析。
测试一个北京到上海的路径导航API网页数据,大约json里面坐标数组几万个,此时良好的解析方式将会凸显出性能的优劣。
我在处理json解析的时候用到三种方式;
第一种 传统android自带的解析方式,使用JSONObject 解析对象, JSONArray 解析数组。
第二种 阿里巴巴开源提供的fastjson.
第三种 谷歌提供的GSON。
实际在几万个数据的解析下 谷歌GSON解析更胜一筹,领先fastjson 几秒,最慢也是自带的 JSONObject .
最后附上GSON解析相关类。fastjson 和传统JSONObject 将不再赘述。
//PoiGsonBean 类 public class PoiGsonBean { private List<PoiInfos> poiInfos; private int totalHits; public void setPoiInfos(List<PoiInfos> poiInfos) { this.poiInfos = poiInfos; } public List<PoiInfos> getPoiInfos() { return this.poiInfos; } public void setTotalHits(int totalHits) { this.totalHits = totalHits; } public int getTotalHits() { return this.totalHits; } public static class PoiInfos { private String address; private Location location; private String name; private int score; private String telephone; private String uid; public void setAddress(String address) { this.address = address; } public String getAddress() { return this.address; } public void setLocation(Location location) { this.location = location; } public Location getLocation() { return this.location; } public void setName(String name) { this.name = name; } public String getName() { return this.name; } public void setScore(int score) { this.score = score; } public int getScore() { return this.score; } public void setTelephone(String telephone) { this.telephone = telephone; } public String getTelephone() { return this.telephone; } public void setUid(String uid) { this.uid = uid; } public String getUid() { return this.uid; } } public class PathInfos { public double pathLength; public List<Location> pathPoints; public double getPathLength(){ return pathLength; } public void setPathLength(){ this.pathLength=pathLength; } public List<Location> getPathPoints (){ return pathPoints; } public void setPathPoints (List<Location> pathPoints){ this.pathPoints=pathPoints; } } public static class Location { private double x; private double y; public void setX(double x) { this.x = x; } public double getX() { return this.x; } public void setY(double y) { this.y = y; } public double getY() { return this.y; } } public static class Junction { private double x; private double y; public void setX(double x) { this.x = x; } public double getX() { return this.x; } public void setY(double y) { this.y = y; } public double getY() { return this.y; } } } //json解析类 public class JsonPara { //解析POI public void parsePOI(String strResult, ArrayList<PoiInfos> locationList) { Type type = new TypeToken<PoiGsonBean>() { }.getType(); Gson gson = new Gson(); PoiGsonBean poiGsonBean = gson.fromJson(strResult, type); locationList.clear(); locationList.addAll(poiGsonBean.getPoiInfos()); } //解析路径导航 public void parseNavigation(String strResult, ArrayList<Location> LocationList) { Type type = new TypeToken<PathInfos>() { }.getType(); Gson gson = new Gson(); PathInfos pathInfos = gson.fromJson(strResult, type); LocationList.addAll(pathInfos.getPathPoints()); } }
相关文章推荐
- Android okHttp 实战(三):okHttp网络请求之Json解析
- Android okHttp网络请求之Json解析
- Android商城开发系列(六)——使用 OkHttpUtils 请求网络 + 使用 fastjson解析数据
- Android下网络请求数据,返回数据显示不全,解析json no value for xxx
- android url网络请求+json解析
- [置顶] Android网络与数据存储03-在线请求天气API,并解析其中的json数据予以显示
- Android--使用原生技术实现ListView(原生技术实现网络异步请求,解析json数据)
- Android--网络请求与json数据解析的使用
- Android使用HttpURLConnection请求网络返回JSON数据并解析
- Android请求网络数据,json解析-FastJson遇到的问题 首字母大写问题
- Android网络与数据存储——网络编程数据处理(网络请求解析Json,解析xml)
- android解析JSON,XML数据的请求网络工具类
- Android网络请求与JSON解析和数据抓取小实例
- Android okHttp网络请求之Json解析(三)
- Android网络开发中如何使用JSON进行网络通信---Android_JSON数据通讯方法解析
- Android 解析网络数据传输JSON或XML对象
- 【Android网络开发の4】解析和生成JSON数据
- 请求网络数据,解析JSON,显示在listview上(采用thread,handler)
- C#中解析json以及网络请求
- IOS学习笔记(16)网络请求,json解析