今天作者使用了下Volley进行网络请求,发现这个网络通讯库很简洁,非常好用。
首先介绍下Volley
Volley是谷歌在2013年Google I/O大会上推出了一个新的网络通信框架。Volley可是说是把AsyncHttpClient和Universal-Image-Loader的优点集于了一身,
既可以像AsyncHttpClient一样非常简单地进行HTTP通信,也可以像Universal-Image-Loader一样轻松加载网络上的图片。除了简单易用之外,Volley在性
能方面也进行了大幅度的调整,它的设计目标就是非常适合去进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作,比如说下载文件等,
Volley的表现就会非常糟糕。
介绍完Volley,我们就来说说Volley的使用吧。
前面也说过Volley的使用是非常简单的,我们就从最简单的http通信开始讲吧。
要使用Volley进行网络请求,可以分为三步:
1).创建RequestQueue对象(注意这里拿到的RequestQueue是一个请求队列对象,它可以缓存所有的HTTP请求,然后按照一定的算法并发地发出这些请求。
RequestQueue内部的设计就是非常合适高并发的,因此我们不必为每一次HTTP请求都创建一个RequestQueue对象,这是非常浪费资源的,基本上在每一
个需要和网络交互的Activity中创建一个RequestQueue对象就足够了)
RequestQueue queue=Volley.newRequestQueue(this);2).创建一个Request对象(Request是一个接口,Volley框架为我们提供了三个实现类:StringRequest,JsonRequest,ImageRequest)
3).将Request对象加到RequestQueue队列中
queue.add(request);那么接下来我们就来介绍各个Request实现类的使用了:
1、StringRequest--进行http请求,响应返回一段String字符串
创建一个StringRequest对象:
StringRequest request = new StringRequest(Method.POST, NetUtils.PATH,
new Listener<String>() {
@Override
public void onResponse(String msg) {
pd.dismiss();
if (msg.equals(SUCCESS)) {
// 说明登录成功
tv_status.setText("已登录");
} else if (msg.equals(FAIL)) {
// 说明登录失败
tv_status.setText("登录失败,请检查用户名密码是否正确");
}
}
}, new ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
if (error.networkResponse != null) {
int code = error.networkResponse.statusCode;
System.out.println("网络错误了" + code);
}
Toast.makeText(getApplicationContext(), "网络错误", 0).show();
pd.dismiss();
}
}){
@Override
protected Map<String, String> getParams()
throws AuthFailureError {
Map<String, String> map=new HashMap<String, String>();
map.put("username",username);
map.put("psw", psw);
return map;
}
};
queue.add(request);可以看到new StringRequest(method, url, listener, errorListener)的构造方法中有四个参数,第一个参数是请求的方式,可以通过内部类Method.GET或者Method.POST来选择,第二个参数是请求的url,
第三个参数是请求成功的监听器,当请求成功会回调里面的onResponse方法,第四个参数是请求失败(包括404,500,以及请求超时等错误)的监听器,当请求失败会回调里面的onErrorResponse方法。
这里值得我们注意的是,GET请求是,请求参数可以通过写在url后面带到服务器,但是POST请求就不行了。那我们来看下,StringRequest中有没有setParam的设置请求参数的方法,很遗憾是没有的。
那么在进行POST请求的时候,我们要如何将请求参数带到服务器呢。分析RequestQueue源码可以发现,当Request对象请求方式时POST的时候,RequestQueue会尝试调用Request总的getParams方法
获得请求参数,故我们只需要重写StringRequest的getParams方法返回一个map即可将请求参数带到服务器了~~~~
由于作者只是使用到StringRequest,所以先说到这里,以后会慢慢更新。。。。。。。
















