Volley概述

在移动终端的项目开发中,移动设备的APP通常在整个项目中做为一个表现层、交互层的角色,因此大都是需要和服务端进行通信。在Android SDK中,谷歌有自带的ApacheHttpClient可以与服务端通信,但是有很多缺陷,比如不能在主线程(UI 线程)中调用,在项目中会经常使用开源的异步网络通信框架。在2013 Google I/O上,谷歌发布了官方的网络通信框架Volley,这样使开发者在Android项目中更加统一、方便。

Volley Source Code

Volley

StringRequest

  1. 获取RequestQueue对象

  2. 使用Volley的前提是要先召唤RequestQueue对象,这个请求队列可以支持高并发,在使用的时候尽量重复使用同一个RequestQueue,而不是创建。 获取对象:
    1
    RequestQueue mQueue = Volley.newRequestQueue(context);
  3. 创建StringRequest对象

  4. 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    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);
    }
    });
    第一个String类型参数是数据请求数据的URL,第二个是返回成功后的回调方法,第三个是返回失败的回调方法。
  5. 添加到RequestQueue

  6. 在创建好了StringRequest对象后别忘了添加到请求队列中
    mQueue.add(stringRequest);
### JsonRequest JSON请求可以和String类型请求举一反三:
1
2
3
4
5
6
7
8
9
10
11
12
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);
}
});
别忘了在最后将JsonRequest对象加入到请求队列中去。
mQueue.add(jsonObjectRequest); ### ImageLoader 用Volley获取网络图片可以通过ImageRequest(和StringRequest类似)和ImageLoader来获取,这里主要介绍下ImageLoader。使用它主要有以下几个步骤: 1. 创建一个RequestQueue对象。 2. 创建一个ImageLoader对象。 3. 获取一个ImageListener对象。 4. 调用ImageLoader的get()方法加载网络上的图片。
1
2
3
4
5
6
7
8
9
10
11
12
ImageLoader imageLoader = new ImageLoader(mQueue, new ImageCache() {
@Override
public void putBitmap(String url, Bitmap bitmap) {
}

@Override
public Bitmap getBitmap(String url) {
return null;
}
});
ImageListener listener = ImageLoader.getImageListener(imageView,R.drawable.default_image, R.drawable.failed_image);
imageLoader.get("http://img.my.csdn.net/uploads/201404/13/1397393290_5765.jpeg", listener);
### 创建一个类使用Volley 之前说过,在使用RequestQueue对象时,最好不要重复创建,既然如此,不如使用一个单例模式的类,通过这个类来处理各种请求,下面示例是一个处理图片请求的类,同事可以通过调addToRequestQueue方法来添加其他的请求:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
public class ImagecacheVolley {
private static ImagecacheVolley mInstance;
private RequestQueue mRequestQueue;
private ImageLoader mImageLoader;
private static Context mCtx;

private ImagecacheVolley (Context context) {
mCtx = context;
mRequestQueue = getRequestQueue();

mImageLoader = new ImageLoader(mRequestQueue,
new ImageLoader.ImageCache() {
private final LruCache<String, Bitmap>
cache = new LruCache<String, Bitmap>(20);

@Override
public Bitmap getBitmap(String url) {
return cache.get(url);
}

@Override
public void putBitmap(String url, Bitmap bitmap) {
cache.put(url, bitmap);
}
});
}

public static synchronized ImagecacheVolley getInstance(Context context) {
if (mInstance == null) {
mInstance = new ImagecacheVolley(context);
}
return mInstance;
}

public RequestQueue getRequestQueue() {
if (mRequestQueue == null) {
// getApplicationContext()是关键, 它会避免
// Activity或者BroadcastReceiver带来的缺点.
mRequestQueue = Volley.newRequestQueue(mCtx.getApplicationContext());
}
return mRequestQueue;
}

public <T> void addToRequestQueue(Request<T> req) {
getRequestQueue().add(req);
}

public ImageLoader getImageLoader() {
return mImageLoader;
}

}