介绍
Android系统中主要提供了两种方式来进行HTTP通信,HttpURLConnection和HttpClient,不过HttpURLConnection和HttpClient的用法还是有些复杂的,所以就有了Android网络通信框架,比如说AsyncHttpClient,它把HTTP所有的通信细节全部封装在了内部,我们只需要简单调用几行代码就可以完成通信操作了。再如Universal-Image-Loader,它使得在界面上显示网络图片的操作变得极度简单,开发者不用关心如何从网络上获取图片,也不用关心开启线程、回收图片资源等细节。
在2013年Google I/O大会上推出了一个新的网络通信框架——Volley,Volley可以说是把AsyncHttpClient和Universal-Image-Loader的优点集于了一身,既可以像AsyncHttpClient一样非常简单地进行HTTP通信,也可以像Universal-Image-Loader一样轻松加载网络上的图片。除了简单易用之外,Volley在性能方面也进行了大幅度的调整,它的设计目标是适合进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作,比如说下载文件等,Volley的表现就会非常糟糕。
Volley的功能:
1.Json、图像等的异步下载;
2.网络请求的排序(scheduling);
3.网络请求的优先级处理;
4.缓存;
5.多级别取消请求;
6.Activity生命周期的联动(Activity结束时同时取消所有网络请求);
使用
1.从git克隆源码,打包成jar包导入项目即可。注意,这个库要求最低SDK版本为Froyo,即至少要设置android:minSdkVersion为8以上。
地址:git clone https://android.googlesource.com/platform/frameworks/volley
2.获取RequestQueue对象,RequestQueue mQueue = Volley.newRequestQueue(context);
注意,这里拿到的RequestQueue是一个请求队列对象,它可以缓存所有的HTTP请求,然后按照一定的算法并发地发出这些请求。因此我们不必为每一次HTTP请求都创建一个RequestQueue对象,这是非常浪费资源的,基本上在每一个需要和网络交互的Activity中创建一个RequestQueue对象就足够了。
- StringRequest stringRequest = new StringRequest("http://www.baidu.com",
- new Response.Listener<String>() {
- @Override
- public void onResponse(String response) {
- //请求成功的回调
- Log.d("TAG", response);
- }
- }, new Response.ErrorListener() {
- @Override
- public void onErrorResponse(VolleyError error) {
- //响应失败的回调
- Log.e("TAG", error.getMessage(), error);
- }
- });
将StringRequest对象添加到RequestQueue里面,
mQueue.add(stringRequest);
另外,由于Volley是要访问网络的,因此不要忘记在你的AndroidManifest.xml中添加权限,
<uses-permission android:name="android.permission.INTERNET" />
3.Get和Post请求
post请求:
StringRequest stringRequest = new StringRequest(Method.POST, url, listener, errorListener);
需要在StringRequest的匿名类中重写getParams()方法,在这里设置POST参数就可以了。
- StringRequest stringRequest = 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("params1", "value1");
- map.put("params2", "value2");
- return map;
- }
- };
mQueue = Volley.newRequestQueue(getApplicationContext());
mQueue.add(new JsonObjectRequest(Method.GET, url, null,
new Listener() {
@Override
public void onResponse(JSONObject response) {
Log.d(TAG, "response : " + response.toString());
}
}, null));
mQueue.start();
4.JsonRequest的用法
JsonRequest继承自Request类,不过由于JsonRequest是一个抽象类,因此无法直接创建它的实例,那么只能从它的子类入手。JsonRequest有两个直接的子类,JsonObjectRequest和JsonArrayRequest,一个是用于请求一段JSON数据的,一个是用于请求一段JSON数组的。
- JsonObjectRequest jsonObjectRequest = new JsonObjectRequest("http://m.weather.com.cn/data/101010100.html", null,
- new Response.Listener<JSONObject>() {
- @Override
- public void onResponse(JSONObject response) {
- Log.d("TAG", response.toString());
- }
- }, new Response.ErrorListener() {
- @Override
- public void onErrorResponse(VolleyError error) {
- Log.e("TAG", error.getMessage(), error);
- }
- });
- 再将这个JsonObjectRequest对象添加到RequestQueue里就可以了。
- mQueue.add(jsonObjectRequest);