android+json回调,android 网络请求+json解析 最优分析

最近在项目中使用到了网络请求,网页数据以 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信息。

// 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 ListpoiInfos;

private int totalHits;

public void setPoiInfos(ListpoiInfos) {

this.poiInfos = poiInfos;

}

public ListgetPoiInfos() {

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 ListpathPoints;

public double getPathLength(){

return pathLength;

}

public void setPathLength(){

this.pathLength=pathLength;

}

public ListgetPathPoints (){

return pathPoints;

}

public void setPathPoints (ListpathPoints){

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, ArrayListlocationList) {

Type type = new TypeToken() {

}.getType();

Gson gson = new Gson();

PoiGsonBean poiGsonBean = gson.fromJson(strResult, type);

locationList.clear();

locationList.addAll(poiGsonBean.getPoiInfos());

}

//解析路径导航

public void parseNavigation(String strResult, ArrayListLocationList) {

Type type = new TypeToken() {

}.getType();

Gson gson = new Gson();

PathInfos pathInfos = gson.fromJson(strResult, type);

LocationList.addAll(pathInfos.getPathPoints());

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值