
前言
在2013年Google I/O大会上推出了一个新的网络通信框架Volley。Volley可是说是把AsyncHttpClient和Universal-Image-Loader的优点集于了一身,既可以像AsyncHttpClient一样非常简单地进行HTTP通信,也可以像Universal-Image-Loader一样轻松加载网络上的图片。除了简单易用之外,Volley在性能方面也进行了大幅度的调整,它的设计目标就是非常适合去进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作,比如说下载文件等,Volley的表现就会非常糟糕。
虽然时至今日,volley在网络框架中的使用度并不高,但是针对它的特性而言,在某些网络请求的需求中,还是可以考虑的.
使用
AndroidStudio
直接在依赖中搜索添加即可
jar包下载:
https://android.googlesource.com/platform/frameworks/volley
github地址:
https://github.com/mcxiaoke/android-volley
基本使用流程:
- 创建Request请求实例
- 获取请求列队
- 将请求添加到列队
- override回调方法
创建队列方法:
1
| private RequestQueue mQueue = null; mQueue = Volley.newRequestQueue(context);
|
创建请求(Request):
StringRequest
StringRequest的默认请求方式为GET,使用其他请求方式可以用其另一种重载形式。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| String url = "http://xxx"; StringRequest request = new StringRequest(url,new Response.Listener<String>() { @Override public void onResponse(String response) { }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { error.printStackTrace(); } }); mQueue.add(request);
|
Response.Listener处理请求成功时的回调。
Response.ErrorListener处理失败时的回调。
JsonRequest
这里的JsonObject是android内置的org.json库,而不是自家的Gson,这点需要注意。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| Map<String,String> params = new HashMap<String,String>(); params.put("name","zhangsan"); params.put("age","17"); JSONObject jsonRequest = new JSONObject(params); Log.i(TAG,jsonRequest.toString()); String url = "http://192.168.56.1:8080/volley_test/servlet/JsonServlet"; JsonObjectRequest request = new JsonObjectRequest(url, jsonRequest, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { },new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { error.printStackTrace(); } }); mQueue.add(request);
|
ImageRequest
ImageRequest可以控制图片的宽高、照片品质。如果宽高比原始宽高小的话,将会进行压缩。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| ImageRequest request = new ImageRequest("http://192.168.56.1:8080/volley_test/image.jpg", new Response.Listener<Bitmap>() { @Override public void onResponse(Bitmap response) { mImageView.setImageBitmap(response); } },0,0, Bitmap.Config.ARGB_8888,new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { show(error.getMessage()); } }); mQueue.add(request);
|
添加请求头
有时候我们需要为Request添加请求头,这时候可以去重写Request的getHeaders方法。
1 2 3 4 5 6 7 8 9 10 11 12 13
| String url = "http://192.168.56.1:8080/volley_test/servlet/JsonServlet"; JsonObjectRequest request = new JsonObjectRequest(url, null,resplistener,errlistener) { @Override public Map<String, String> getHeaders() throws AuthFailureError { Map<String,String> map = new HashMap<String,String>(); map.put("header1","header1_val"); map.put("header2","header2_val"); return map; } };
|
添加post请求参数
添加Post请求参数可以重写Request的GetParams方法,另需 修改请求参数为POST。
1 2 3 4 5 6 7 8 9 10 11 12 13
| String url = "http://192.168.56.1:8080/volley_test/servlet/PostServlet"; StringRequest request = new StringRequest(Method.POST,url,listener, errorListener) { @Override protected Map<String, String> getParams() throws AuthFailureError { Map<String,String> map = new HashMap<String,String>(); map.put("KEY1","value1"); map.put("KEY2", "value2"); return map; } };
|
Request里面还有一些getXXX方法,大家参考代码自己琢磨吧。
取消请求
当Activity销毁时,我们可能需要去取消一些网络请求,这时候可以通过如下方式:
1 2 3 4 5 6 7 8
| Request req = ...; request.setTag("MAIN_ACTIVITY"); onDestroy() { mQueue.cancelAll("MAIN_ACTIVITY"); } 为属于该Activity的请求全部加上Tag,然后需要销毁的时候调用cancelAll传入tag即可。 RequestQueue#cancelAll还有另一种重载形式,可以传入RequestFilter,自己指定一个过滤策略。 如果我们需要干掉所有请求,并且后续不再有网络请求,可以干掉RequestQueue,调用其stop方法即可。
|
全局共享RequestQueue
RequestQueue没有必要每个Activity里面都创建,全局保有一个即可。这时候自然想到使用Application了。我们可以在Application里面创建RequestQueue,并向外暴露get方法。代码很简单,相信大家都会写。