一.基本使用
之前做Android开发都是使用学长自己封装好的网络请求框架,第三方网络框架也很多,网上搜索了一下,大多数人推荐使用
- android-async-http
- okhttp
- Volley
其中Volley是Google推出了官方的针对Android平台上的网络通信库,能非常简单地进行HTTP通信,并支持类似Universal-Image-Loader的网络图片加载。
下面举例说明下Volley的最基本Http请求方法,后台是Struct2 的action接口,方法名为login,参数为用户名和密码
private void testHttp(){
//新建一个请求,参数为(请求方式,网络地址,请求成功回调,请求失败回调),如果有参数传递的话重写StringRequest的 Map<String, String> getParams() 方法
StringRequest request = new StringRequest(Method.POST, "http://localhost:8080/app_login.action", new Response.Listener<String>(){
@Override
public void onResponse(String response) {
// TODO Auto-generated method stub
System.out.println("success:"+response);
}
}, new ErrorListener(){
@Override
public void onErrorResponse(VolleyError error) {
// TODO Auto-generated method stub
System.out.println("error:"+error);
}
}){
@Override
protected Map<String, String> getParams() throws AuthFailureError {
// TODO Auto-generated method stub
Map<String, String> map = new HashMap<String, String>();
map.put("username", "123456");
map.put("password", "123456");
return map;
}
};
//最后获取到一个RequestQueue请求队列对象,它可以缓存所有的HTTP请求,然后按照一定的算法并发地发出这些请求,将request对象添加到RequestQueue里面,让RequestQueue智能的调用
RequestQueue mQueue = Volley.newRequestQueue(getActivity());
mQueue.add(request);
}
调用以上方式,打印出返回的Json结果,如图:
二.优化
在项目中,很多地方都需要用到网络请求和服务器进行数据交换,可以对Volley进行简单的封装:
1.新建一个BaseActivity类,继承Activity,添加如下方法:
private static final String httpUrl = "http://localhost:8080/";
protected static final String Login = "app_login.action";
protected static final String Sign = "app_sign.action";
protected static final String getWallet = "app_getWallet.action";
public void asyHttp(String method,final Map<String,String> map,HttpCallBack callBack){
this.httpCallBack = callBack;
StringRequest request = new StringRequest(Method.POST, httpUrl+method, new Response.Listener<String>(){
@Override
public void onResponse(String response) {
httpCallBack.Success(response);
System.out.println("success:"+response);
}
}, new ErrorListener(){
@Override
public void onErrorResponse(VolleyError error) {
httpCallBack.Fail(error.toString());
System.out.println("error:"+error);
}
}){
@Override
protected Map<String, String> getParams() throws AuthFailureError {
return map;
}
};
RequestQueue mQueue = Volley.newRequestQueue(getActivity());
mQueue.add(request);
}
其中定义了网络请求的地址,和所有需要用到的请求接口,asyHttp的参数为(方法名,参数,成功回调,失败回调)
2.在需要用到网络请求的Activity,继承BaseActivity,并调用asyHttp方法
Map<String, String> map = new HashMap<String, String>();
map.put("username", "123456");
map.put("password", "123456");
asyHttp(Login, map, new HttpCallBack(){
@Override
public void Success(String respose) {
//成功之后的处理代码
}
@Override
public void Fail(String error) {
//失败之后的处理代码
}
});