Volley概述 在移动终端的项目开发中,移动设备的APP通常在整个项目中做为一个表现层、交互层 的角色,因此大都是需要和服务端进行通信。在Android SDK中,谷歌有自带的ApacheHttpClient可以与服务端通信,但是有很多缺陷,比如不能在主线程(UI 线程)中调用,在项目中会经常使用开源的异步网络通信框架。在2013 Google I/O上,谷歌发布了官方的网络通信框架Volley,这样使开发者在Android项目中更加统一、方便。
Volley Source Code Volley
StringRequest
获取RequestQueue对象
使用Volley的前提是要先召唤RequestQueue对象,这个请求队列可以支持高并发,在使用的时候尽量重复使用同一个RequestQueue,而不是创建。
获取对象:
1 RequestQueue mQueue = Volley.newRequestQueue(context);
创建StringRequest对象
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,第二个是返回成功后的回调方法,第三个是返回失败的回调方法。
添加到RequestQueue
在创建好了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) { mRequestQueue = Volley.newRequestQueue (mCtx.getApplicationContext ()); } return mRequestQueue; } public <T> void addToRequestQueue (Request<T> req) { getRequestQueue ().add (req); } public ImageLoader getImageLoader () { return mImageLoader; } }