[关闭]
@kimo 2016-02-18T03:33:27.000000Z 字数 3965 阅读 2374

Volley学习笔记

android笔记


*什么是Volley

Volley 是 Google 推出的 Android 异步网络请求框架和图片加载框架。在 Google I/O 2013 大会上发布。

Volley 的特点:特别适合数据量小,通信频繁的网络操作。(个人认为 Android 应用中绝大多数的网络操作都属于这种类型)。

**优点

总体设计图

主要是通过两种Dispatch Thread不断从RequestQueue中取出请求,根据是否已缓存调用Cache或Network这两类数据获取接口之一,从内存缓存或是服务器取得请求的数据,然后交由ResponseDelivery去做结果分发及回调处理。

流程图

详细设计

这是 Volley 框架的主要类关系图

图中红色圈内的部分,组成了 Volley 框架的核心,围绕 RequestQueue 类,将各个功能点以组合的方式结合在了一起。各个功能点也都是以接口或者抽象类的形式提供。
红色圈外面的部分,在 Volley 源码中放在了 toolbox 包中,作为 Volley 为各个功能点提供的默认的具体实现。
通过类图我们看出, Volley 有着非常好的拓展性。通过各个功能点的接口,我们可以给出自定义的,更符合我们需求的具体实现。

多用组合,少用继承;针对接口编程,不针对具体实现编程。优秀框架的设计,令人叫绝,受益良多。

加入请求 流程图

缓存处理流程图

网络处理流程图

使用

  1. RequestQueue mQueue = Volley.newRequestQueue(context); //1
  2. StringRequest stringRequest = new StringRequest("http://www.baidu.com",
  3. new Response.Listener<String>() {
  4. @Override
  5. public void onResponse(String response) {
  6. Log.d("TAG", response);
  7. }
  8. }, new Response.ErrorListener() {
  9. @Override
  10. public void onErrorResponse(VolleyError error) {
  11. Log.e("TAG", error.getMessage(), error);
  12. }
  13. }); //2
  14. mQueue.add(stringRequest);//3
  15. StringRequest stringRequest = new StringRequest(Method.POST, url, listener, errorListener) {
  16. @Override
  17. protected Map<String, String> getParams() throws AuthFailureError {
  18. Map<String, String> map = new HashMap<String, String>();
  19. map.put("params1", "value1");
  20. map.put("params2", "value2");
  21. return map;
  22. }
  23. };
  24. JsonObjectRequest jsonObjectRequest = new JsonObjectRequest("http://m.weather.com.cn/data/101010100.html", null,
  25. new Response.Listener<JSONObject>() {
  26. @Override
  27. public void onResponse(JSONObject response) {
  28. Log.d("TAG", response.toString());
  29. }
  30. }, new Response.ErrorListener() {
  31. @Override
  32. public void onErrorResponse(VolleyError error) {
  33. Log.e("TAG", error.getMessage(), error);
  34. }
  35. });
  36. ImageRequest imageRequest = new ImageRequest(
  37. "http://developer.android.com/images/home/aw_dac.png",
  38. new Response.Listener<Bitmap>() {
  39. @Override
  40. public void onResponse(Bitmap response) {
  41. imageView.setImageBitmap(response);
  42. }
  43. }, 0, 0, Config.RGB_565, new Response.ErrorListener() {
  44. @Override
  45. public void onErrorResponse(VolleyError error) {
  46. imageView.setImageResource(R.drawable.default_image);
  47. }
  48. });
  49. ImageLoader imageLoader = new ImageLoader(mQueue, new ImageCache() {
  50. @Override
  51. public void putBitmap(String url, Bitmap bitmap) {
  52. }
  53. @Override
  54. public Bitmap getBitmap(String url) {
  55. return null;
  56. }
  57. });//1
  58. ImageListener listener = ImageLoader.getImageListener(imageView,
  59. R.drawable.default_image, R.drawable.failed_image); //2
  60. imageLoader.get("http://img.my.csdn.net/uploads/201404/13/1397393290_5765.jpeg", listener);
  61. //imageLoader.get("http://img.my.csdn.net/uploads/201404/13/1397393290_5765.jpeg", listener, 200, 200);
  62. public class BitmapCache implements ImageCache {
  63. private LruCache<String, Bitmap> mCache;
  64. public BitmapCache() {
  65. int maxSize = 10 * 1024 * 1024;
  66. mCache = new LruCache<String, Bitmap>(maxSize) {
  67. @Override
  68. protected int sizeOf(String key, Bitmap bitmap) {
  69. return bitmap.getRowBytes() * bitmap.getHeight();
  70. }
  71. };
  72. }
  73. @Override
  74. public Bitmap getBitmap(String url) {
  75. return mCache.get(url);
  76. }
  77. @Override
  78. public void putBitmap(String url, Bitmap bitmap) {
  79. mCache.put(url, bitmap);
  80. }
  81. }
  82. //定制request
  83. public class GsonRequest<T> extends Request<T> {
  84. private final Listener<T> mListener;
  85. private Gson mGson;
  86. private Class<T> mClass;
  87. public GsonRequest(int method, String url, Class<T> clazz, Listener<T> listener,
  88. ErrorListener errorListener) {
  89. super(method, url, errorListener);
  90. mGson = new Gson();
  91. mClass = clazz;
  92. mListener = listener;
  93. }
  94. public GsonRequest(String url, Class<T> clazz, Listener<T> listener,
  95. ErrorListener errorListener) {
  96. this(Method.GET, url, clazz, listener, errorListener);
  97. }
  98. @Override
  99. protected Response<T> parseNetworkResponse(NetworkResponse response) {
  100. try {
  101. String jsonString = new String(response.data,
  102. HttpHeaderParser.parseCharset(response.headers));
  103. return Response.success(mGson.fromJson(jsonString, mClass),
  104. HttpHeaderParser.parseCacheHeaders(response));
  105. } catch (UnsupportedEncodingException e) {
  106. return Response.error(new ParseError(e));
  107. }
  108. }
  109. @Override
  110. protected void deliverResponse(T response) {
  111. mListener.onResponse(response);
  112. }
  113. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注