今天作者使用了下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,所以先说到这里,以后会慢慢更新。。。。。。。