您的位置:首页 > 理论基础 > 计算机网络

AsyncHttp+gson解析

2016-07-08 22:13 441 查看
http://www.open-open.com/lib/view/open1437028262990.html

网上其实也有很多类似的这种框架  不过还是觉得自己写的用着比较方便,(ps:自己的总是最好的 ^_^)

闲下来整理出来了自己之前用过的框架 拿出来封装了一下。也写个记录,省的以后忘了。

本框架利用的是Async-Http.jar+gson.jar进行二次封装。

 

首先 先建立一个抽象类,并定义一些常用的抽象方法:
public abstract class HttpRequest {

/**
* @description: 获取参数
* @author:hc
* @return:RequestParams
* @return
*/

public abstract RequestParams getParams();

/**
* @description:
* @author:hc
* @return:String
* @return
*/

public abstract String getUrlString();

/**
* @description:
* @author:hc
* @return:void
* @param arg3
*/

public abstract void onFailure(Throwable arg3);

/**
* @description:
* @author:hc
* @return:void
* @param arg2
*/

public abstract void onSuccess(String result);
}


然后定义网络访问成功和失败的接口:

1 public interface HttpSuccess<T> {
2
3     public void onSuccess(T result);
4
5 }

public interface HttpError {

public void onError(Throwable arg0) ;

}


接下来定义一个泛型类来接收服务器返回的数据:
public class HttpData<T> {

/**
* @param cls
* @param param
* @param httpSuccess
* @param httpError
* @return
*/
public HttpClassRequest<T> newHttpRequest(Class<T> cls, HashMap<String, String> param, HttpSuccess<T> httpSuccess, HttpError httpError) {

// 如果这里请求需要添加公共参数在此添加
// param.put(key, value)

return new HttpClassRequest<T>(cls, param, httpSuccess, httpError);

}
}


然后是请求数据处理类:
public class HttpClassRequest<T> extends HttpRequest {

private HashMap<String, String> params;
private HttpError error;

private HttpSuccess<T> success;

private Class<T> cls;

/**
* create a instance HttpRequest.
*
* @param cls
* @param map
* @param httpSuccess
* @param httpError
*/
public HttpClassRequest(Class<T> cls, HashMap<String, String> map, HttpSuccess<T> httpSuccess, HttpError httpError) {
this.cls = cls;
this.params = map;
this.success = httpSuccess;
this.error = httpError;

}

/**
* @description: 获取参数
* @author:hc
* @return:RequestParams
* @return
*/

@Override
public RequestParams getParams() {
// TODO Auto-generated method stub
final RequestParams requestParams = new RequestParams();

StringBuilder stringBuilder = new StringBuilder();
Iterator<String> iterator = params.keySet().iterator();

while (iterator.hasNext()) {

String key = iterator.next().toString();

requestParams.put(key, params.get(key));

String val = params.get(key);
stringBuilder.append("&" + key + "=" + val);

}

CustomLog.d("提交参数为   %s", "=" + stringBuilder.toString());

return requestParams;
}

/**
* @description:
* @author:hc
* @return:String
* @return
*/

@Override
public String getUrlString() {
return Constant.url;
}

/**
* @description:
* @author:hc
* @return:void
* @param arg3
*/

@Override
public void onFailure(Throwable arg3) {
if (error != null)
error.onError(arg3);
}

/**
* @description:
* @author:hc
* @return:void
* @param arg2
*/

@Override
public void onSuccess(String arg2) {

Gson gson = new Gson();

CustomLog.d("结果是=%s", arg2);

try {
if (success != null)
success.onSuccess(gson.fromJson(arg2, cls));
} catch (JsonSyntaxException e) {

if (error != null)
error.onError(e);
}

}
}


类中的方法是由抽象类中继承下来的方法:分别是 getParams() 对请求参数进行封装;getUrlString() 返回请求连接;onFailure(Throwable throwable) 请求失败处理;onSuccess(String
result) 请求成功的处理,其中 在返回成功的时候拿到返回数据,并把他封装成json对象数据回调出去。

接下来就是重点了:

 
public class HttpRequestQueque {

private AsyncHttpClient client;// 实例话对象

private HttpRequest _httpRequst;

private RequestParams params;

/**
* create a instance HttpRequestQueque.
*
* @param context
*/
public HttpRequestQueque(Context context) {
client = new AsyncHttpClient();
client.setTimeout(30000);
}

/**
* @description: 添加请求
* @author:hc
* @return:void
* @param httpRequst
*/

public void add(HttpRequest httpRequst) {
this._httpRequst = httpRequst;
this.cance();
params = httpRequst.getParams();

CustomLog.d("JSONObject=%s", _httpRequst.getUrlString());

this._get(_httpRequst.getUrlString(), params, new TextHttpResponseHandler() {

@Override
public void onFailure(int arg0, Header[] arg1, String arg2, Throwable arg3) {

CustomLog.d("http_stats_code=%s", " " + arg0);

_httpRequst.onFailure(arg3);

}

@Override
public void onSuccess(int arg0, Header[] arg1, String arg2) {
// TODO Auto-generated method stub
_httpRequst.onSuccess(arg2);
}
});

}

/**
* @description: post 上传
* @author:hc
* @return:void
* @param httpRequst
*/

public void addPost(HttpRequest httpRequst) {

this._httpRequst = httpRequst;

params = httpRequst.getParams();

CustomLog.d("SERVER_URL_POST==%s", _httpRequst.getUrlString());

this._post(_httpRequst.getUrlString(), params, new AsyncHttpResponseHandler() {

@Override
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
_httpRequst.onSuccess(new String(responseBody));

}

@Override
public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {

CustomLog.d("statusCode ==== %d", statusCode);
_httpRequst.onFailure(error);

}
});

}

/**
* @description: 取消加载
* @author:hc
* @return:void
*/

public void cance() {
client.cancelAllRequests(true);
}

/**
* @description: 執行http请求
* @author:hc
* @return:void
* @param urlString
* @param params
* @param res
*/

private void _get(String urlString, RequestParams params, AsyncHttpResponseHandler res) // url里面带参数
{
client.get(urlString, params, res);
}

/**
* @description: 执行post请求
* @author:hc
* @return:void
* @param urlString
* @param params
* @param res
*/

private void _post(String urlString, RequestParams params, AsyncHttpResponseHandler res) // url里面带参数
{

client.post(urlString, params, res);
}
}


之前的代码都是为了使用方便进行二次封装,最终使用的是在这里使用async-http.jar进行网络访问,然后回调我们写的方法,让我们更加快捷的拿到结果。

 

 

好了  接下来要看怎么去使用了

首先我们需要根据后台给出的接口定义我们的javabean;

javabean需要对应着后台返回的json对象来建立:如返回的json是



System_id:xxxxx 

items:[

obj:xxxx

]

  }

这样我们就需要建立两个javabean,javabean的成员变量的名字必须要与json节点的名字相同,否则gson无法解析。

 
public class JsonObj {

String System_id;
ArrayList<Itemobj> items;

public String getSystem_id() {
return System_id;
}

public void setSystem_id(String system_id) {
System_id = system_id;
}

public ArrayList<itemObj> getItems() {
return items;
}

public void setItems(ArrayList<itemObj> items) {
this.items = items;
}
}


public class Itemobj{
String obj

private get……
private set……

}


然后则开始使用我们的框架进行网络访问了,代码如下:

先建立一个网络访问的方法:
public class JsonTextData {

/**
*
* getFindList: 请求同时获取返回obj
* TODO(这里描述这个方法适用条件 – 可选)
* TODO(这里描述这个方法的执行流程 – 可选)
* TODO(这里描述这个方法的使用方法 – 可选)
* TODO(这里描述这个方法的注意事项 – 可选)
*
* @param  @param type
* @param  @param typeId
* @param  @param page
* @param  @param friendId
* @param  @param httpSuccess
* @param  @param httpError
* @param  @return    设定文件
* @return HttpClassRequest<JsonObj>    DOM对象
* @throws
* @since  CodingExample Ver 1.1
*/
public static HttpClassRequest<JsonObj> getTestObj(String page,
HttpSuccess<JsonObj> httpSuccess, HttpError httpError) {
HashMap<String, String> hashMap = new HashMap<String, String>();

hashMap.put("r", "DiscoveryContent/list");
hashMap.put("pageSize", "10");
hashMap.put("page", page);

HttpData<JsonObj> huiHenDuoData = new HttpData<JsonObj>();
return huiHenDuoData.newHttpRequest(JsonObj.class, hashMap, httpSuccess, httpError);

}
}


然后在我们在请求网络数据的地方使用:
public class MainActivity extends Activity {

private HttpRequestQueque requestQueque;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

requestQueque = new HttpRequestQueque(MainActivity.this);

requestQueque.add(JsonTextData.getTestObj("1", new HttpSuccess<JsonObj>() {

@Override
public void onSuccess(JsonObj jsonObj) {

String obj = jsonObj.getSystem_id();

}
}, new HttpError() {

@Override
public void onError(Throwable arg0) {

// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, "失败了!!!!!", 1).show();

}
}));
}
}


这样我们就能够轻而易举的拿到服务器给返回的数据了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: