`

android volley网络框架

 
阅读更多

我理解的基于网络的应用最核心的其实就是request跟response的分发。这个分发机制写好了,框架够健壮,扩展性高,那么以后涉及到这个层次的 改动就少(因为从一开始我们的设计都是比较初级的,会随着需求的不断增多而出现一些需要对框架机制的改动需求),因为对于分发机制的改动是很核心的,说牵 一发而动全身一点也不为过,稍微改一点点都会对项目有很大的影响甚至是未知的影响,而且构建得不好的话,有些需求的改动会非常麻烦,而这些改动如果是良好 的构架的话往往是可以避免的,所以,在初期能够构建好一些是很有必要的。我大概看过一些开源的项目以及这些年来自己做过的项目(没做过游戏,所以游戏的我 不知道哈),感觉基于网络的应用要么用http要么用套接字,如果不需要推送的,一般都是使用http来做。
       http的请求步骤大概分为这么几步,就我看来:
       1)发起request,这里的发起者要是个context之类的(一般是activity或者service)东东,当然很多时候发起者也是最后数据的 接受者。不同的框架对于这个发起的机制实现各不相同,但总的说来都是统一给出一个公共接口,让发起者封装好必要的信息,使用公共接口,让其实现类去启动实 际的http请求操作,大概主要区别在于如何封装这些request信息。
       2)进行request请求,并获取response。真正的请求和响应就在这里完成,这里可能有两个需要考虑到的,一个是线程的阻塞,有的框架会让线程 阻塞直到获取到响应为止,有的框架则会在这里分发出多个线程,以避免这种阻塞,当然大多数都会采用后者了。二个就是数据的存储,有些固定的请求,比如一些 不会轻易变动的信息,在第一次请求到了之后就不需要再多次请求了,一般也可以在这个部分完成这个功能。但总而言之,不管你线程分配也好,使用本地数据也 好,还是你的请求出问题了也好,总之你必须在一定的时间内,给我的request一个response。
      3)分派response,我们去餐馆吃饭都知道,哪桌点的菜就端到哪桌去,不能端错了。谁发出的request,最后就要给到他的接受者手里,不能给错了。有些框架是靠一些接口类的注入来保证数据的正确接受,有些框架是靠一个寻找机制来保障的(比如广播)。

       好了,说了这么多我们来看看volley吧。前面那么多铺垫也不是白用的,我就按照我理解的这三步来拆析volley框架。
      1)发起request:volley使用Request抽象类来封装请求。Request类也是整个 volley项目中最核心的类(还真没有之一)。从源码我们可以看到,Request的实现类有好几种,而这些实现类有个共同的特点就是他们其实已经定义 好了response返回的数据类型,也就是说,其实这里的Requst类并不单单只做request,他们也负责对response的数据处理(当然直 接使用实现类的话,我们一般不管这些数据如何被处理的),我们可以自己写实现类并实现其中的数据处理方法
         abstract protected Response<T> parseNetworkResponse(NetworkResponse response);
         来将返回数据变成我们想要的类型,然后由我们再来进一步加工处理。
         Request可不单单只做了这么一件事情。为了证明他为什么是最核心的类,我再列举几个他做了的貌似跟他不相关的事情。
         abstract protected void deliverResponse(T response);
         public void deliverError(VolleyError error)
         有木有震惊的赶脚,是的,最后response以及error的分发的实际执行者也是Request。所以这个Request类是贯穿一个请求到响应过 程自始至终的类。这个其实不难理解,最后一步的分派工作需要一定的信息来保证分派的正确性,而最能提供这些信息的,其实就是最初我们发出的request 了。
         简单的介绍下Request如何使用:
         从源码可以看出 getUrl 是返回的 url地址,getBody是 返回的请求参数,这两个方法是在http的实际请求中肯定要用到的,使用get请求的话是需要保证getUrl的返回值正确即可,而使用post的话还要 保证后面一个方法的返回值正确。(返回值如何注入就是你们的事情了,构造函数注入也可,set 方法注入也可)这里需要给大家注意的地方原生态的Stringrequest 没有重写 getBody 方法,也就是说 getBody 返回为null,那么 volley将默认使用get请求,如果大家想用post请求并使用Stringrequest的话,请重写这个方法。
          另外还有两个很重要的类,请大家在构造request的时候务必要注入,ErrorListener 和 Listener,一个是用来处理error(public void onErrorResponse(VolleyError error))的,一个是用来处理正常返回的(public void onResponse(T response))这两个接口的定义都在Response类中。不难想出上面我所说的两个方法abstract protected void deliverResponse(T response)public void deliverError(VolleyError error) 的实现其实就是调用这两个接口各自的方法就可以了。
          有些附加的条件我们可以酌情的考虑是否需要实现。
          public String getCacheKey(),CacheKey是volley从 Request获取的用于本地存储请求数据的键值,相信大家很快能明白,如果两个request的这个方法返回的值一样的话,后者将能够有机会取到前者存 储在本地的数据,从而减少了网络请求。原生态的Request是使用url为cechekey,这样并不一定科学,有本地存储需求的童鞋,请切记重写此方 法。当然前提是保证 public final boolean shouldCache()返回为true。否则前功尽弃。
           public void setRetryPolicy(RetryPolicy retryPolicy),从字面意思就可以看出,这个是对一个request的重新请求策略的设置,不同的项目是否需要重新请求,重新请求几次,请求超时的时间,这些就在这设置到里面。一般放就是继承RetryPolicy 类,根据自己的需求实现父类方法。
          不知不觉写了这么多,先写到这里吧,后面我再介绍volley如何实现第二步跟第三步。

 

 

前一篇粗略的介绍了一下Volley,并在最后附上了一段使用代码,这一篇详细的介绍一下Volley的使用。前面也说了Volley主要获取JSON对象和图片加载,这里也分为两部分介绍。

1、获取JSON对象

1.1声明RequestQueue

声明一个新的RequestQueue对象
  1. private RequestQueue mRequestQueue;  
 
onCreate初始化mRequestQueue
  1. mRequestQueue =  Volley.newRequestQueue(this);  

1.2 声明并使用Request

  1. JsonObjectRequest jr = new JsonObjectRequest(Request.Method.GET,url,null,new Response.Listener<JSONObject>() {  
  2.             @Override  
  3.             public void onResponse(JSONObject response) {  
  4.                 Log.i(TAG,response.toString());  
  5.                 parseJSON(response);  
  6.                 va.notifyDataSetChanged();  
  7.                 pd.dismiss();  
  8.             }  
  9.         },new Response.ErrorListener() {  
  10.             @Override  
  11.             public void onErrorResponse(VolleyError error) {  
  12.                 Log.i(TAG,error.getMessage());  
  13.             }  
  14.         });  
  15.         mRequestQueue.add(jr);  


Volley提供了JsonObjectRequest、JsonArrayRequest、StringRequest等Request形式。

JsonObjectRequest:返回JSON对象。

JsonArrayRequest:返回JsonArray。

StringRequest:返回String,这样可以自己处理数据,更加灵活。

另外可以继承Request<T>自定义Request。

 

1.3 取消Request

      Activity里面启动了网络请求,而在这个网络请求还没返回结果的时候,Activity被结束了,此时如果继续使用其中的Context等,除了无辜的浪费CPU,电池,网络等资源,有可能还会导致程序crash,所以,我们需要处理这种一场情况。使用Volley的话,我们可以在Activity停止的时候,同时取消所有或部分未完成的网络请求。Volley里所有的请求结果会返回给主进程,如果在主进程里取消了某些请求,则这些请求将不会被返回给主线程。Volley支持多种request取消方式。
1)可以针对某些个request做取消操作:


  1. @Override  
  2.    public void onStop() {  
  3.        for (Request <?> req : mRequestQueue) {  
  4.            req.cancel();  
  5.        }  
  6.    }  
 
2)取消这个队列里的所有请求:

  1. @Override  
  2. protected void onStop() {  
  3.     // TODO Auto-generated method stub  
  4.     super.onStop();  
  5.     mRequestQueue.cancelAll(this);  
  6. }  

3)可以根据RequestFilter或者Tag来终止某些请求
  1. @Override  
  2. rotected void onStop() {  
  3. // TODO Auto-generated method stub  
  4. super.onStop();  
  5.   
  6. mRequestQueue.cancelAll( new RequestFilter() {});  
  7. or  
  8. mRequestQueue.cancelAll(new Object());  
  9.   
  10.    
 
Volley支持http的GET、POST、PUT、DELETE等方法,上面给出了GET方法,其他方法请参考
 
 
 

2、图片加载

2.1使用ImageRequest下载图片

    Volley提供了多种Request方法,ImageRequest能够处理单张图片,返回bitmap。下面是ImageRequest的使用例子,和JsonRequest的一样。
  1. singleImg=(ImageView)findViewById(R.id.volley_img_single_imgeview);  
  2.         ImageRequest imgRequest=new ImageRequest(url, new Response.Listener<Bitmap>() {  
  3.             @Override  
  4.             public void onResponse(Bitmap arg0) {  
  5.                 // TODO Auto-generated method stub  
  6.                 singleImg.setImageBitmap(arg0);  
  7.             }  
  8.         }, 300200, Config.ARGB_8888, new ErrorListener(){  
  9.             @Override  
  10.             public void onErrorResponse(VolleyError arg0) {  
  11.                 // TODO Auto-generated method stub  
  12.                   
  13.             }             
  14.         });  
  15.         mRequestQueue.add(imgRequest);  


2.2使用ImageLoader

    ImageLoader这个类需要一个Request的实例以及一个ImageCache的实例。图片通过一个URL和一个ImageListener实 例的get()方法就可以被加载。从哪里,ImageLoader会检查ImageCache,而且如果缓存里没有图片就会从网络上获取。

    Volley的ImageCache接口允许你使用你喜欢的L1缓存实现。不幸的是Volley没有提供默认的实现。在I/O的介绍中展示了BitmapLruCache的一点代码片段,但是Volley这个库本身并不包含任何相关的实现。

    ImageCache接口有两个方法,getBitmap(String url)和putBitmap(String url, Bitmap bitmap).这两个方法足够简单直白,他们可以添加任何的缓存实现。

  1. RequestQueue mRequestQueue = Volley.newRequestQueue(this);  
  2.         final LruCache<String, Bitmap> mImageCache = new LruCache<String, Bitmap>(  
  3.                 20);  
  4.         ImageCache imageCache = new ImageCache() {  
  5.             @Override  
  6.             public void putBitmap(String key, Bitmap value) {  
  7.                 mImageCache.put(key, value);  
  8.             }  
  9.   
  10.             @Override  
  11.             public Bitmap getBitmap(String key) {  
  12.                 return mImageCache.get(key);  
  13.             }  
  14.         };  
  15.         ImageLoader mImageLoader = new ImageLoader(mRequestQueue, imageCache);  
  16.         // imageView是一个ImageView实例  
  17.         // ImageLoader.getImageListener的第二个参数是默认的图片resource id  
  18.         // 第三个参数是请求失败时候的资源id,可以指定为0  
  19.         ImageListener listener = ImageLoader  
  20.                 .getImageListener(imageView, android.R.drawable.ic_menu_rotate,  
  21.                         android.R.drawable.ic_delete);  
  22.         mImageLoader.get(url, listener);  
 

2.3 使用NetworkImageView

 

  1. public class NetworkImageView extends ImageView  

继承自ImageView,添加了一个

  1. public void setImageUrl(String url, ImageLoader imageLoader) {}  

方法,参数包含一个Url地址和一个ImageLoader对象
核心方法:

  1. private void loadImageIfNecessary(final boolean isInLayoutPass) {}  

内部实现,boolean 类型参数代表是否重新请求网络 ,true:重新请求 false:取缓存
内 部实现和ImageLoader类似,都是通过ImageContainer中new一个ImageListener,在ImageListener,只 是做了Url的空判断,如果Url为null,则调用ImageContainer.cancelRequest();取消请求。
覆写方法:
 

  1. @Override  
  2. protected void onLayout(boolean changed, int left, int top, int right, int bottom) {  
  3. super.onLayout(changed, left, top, right, bottom);  
  4. //onLayout时重新请求  
  5. loadImageIfNecessary(true);  
  6. }  
  7. @Override  
  8. protected void onDetachedFromWindow() {  
  9. //销毁View的时候Release操作  
  10. if (mImageContainer != null) {  
  11. // If the view was bound to an image request, cancel it and clear  
  12. // out the image from the view.  
  13. mImageContainer.cancelRequest();  
  14. setImageBitmap(null);  
  15. // also clear out the container so we can reload the image if necessary.  
  16. mImageContainer = null;  
  17. }  
  18. super.onDetachedFromWindow();  
  19. }  
  20. //drawable状态改变重绘  
  21. @Override  
  22. protected void drawableStateChanged() {  
  23. super.drawableStateChanged();  
  24. invalidate();  
  25. }  



    总结:网络请求下载图片显示,可以使用此控件,比传统的ImageView多了网络处理,也添加了2个方法,设置开始下载的默认图和下载出错后显示图。

  1. /** 
  2. * Sets the default image resource ID to be used for this view until the attempt to load it 
  3. * completes. 
  4. */  
  5. public void setDefaultImageResId(int defaultImage) {  
  6. mDefaultImageId = defaultImage;  
  7. }  
  8. /** 
  9. * Sets the error image resource ID to be used for this view in the event that the image 
  10. * requested fails to load. 
  11. */  
  12. public void setErrorImageResId(int errorImage) {  
  13. mErrorImageId = errorImage;  

分享到:
评论

相关推荐

    Android volley 网络框架学习

    **Android Volley 框架详解** Volley 是 Google 推出的一个高效的网络请求库,专为 Android 应用设计,旨在简化网络通信并优化应用程序性能。它的主要特点是速度快、内存管理优秀、支持异步请求以及提供了强大的...

    Android volley网络框架demo

    这个"Android volley网络框架demo"提供了一套完整的示例代码,帮助开发者理解和应用Volley进行网络请求。下面我们将深入探讨Volley的基本概念、核心组件以及如何在实际项目中使用。 **Volley简介** Volley是为...

    Android Volley Jar框架 v2017.3.17.zip

    Android Volley Jar,Android Volley框架是android开发中不可或缺的一个重要框架,想使用Android开发更加便捷的途径就是使用Volley框架了。 Android Volley Jar框架简介 我们平时在开发Android应用的时候不可避免...

    Android Volley框架使用实例

    **Android Volley 框架详解** Volley 是 Google 在 2013 年的 I/O 大会上推出的一个强大的网络通信库,专为 Android 应用设计,旨在简化网络请求处理并提供高效的图片加载功能。Volley 的核心设计理念是速度和易用...

    Android网络请求框架之volley框架

    - `volley.jar`:这是Volley框架的核心库,包含了所有Volley的类和方法,可以直接添加到Android项目的libs目录下,通过添加依赖进行使用。 - 源码:源码文件通常包含所有Volley的类和方法,开发者可以通过阅读源码...

    Android Volley框架的基本使用解析

    Android之Volley框架的使用,包括Volley的get和post请求方式的使用、Volley的取消队列网络请求和Volley与Activity生命周期的联动、Volley的简单的二次回调封装、Volley加载图片的介绍及用法

    Android网络通信框架Volley

    **Android网络通信框架Volley详解** Volley是Google在2013年I/O大会上推出的一款专门为Android平台设计的网络通信框架,它以其高效的性能、简单的API和良好的可扩展性,成为了众多Android开发者进行网络请求时的...

    AndroidVolley框架使用源代码

    这个压缩包文件 "Android_Volley" 很可能包含了Volley框架的源代码,使得开发者可以深入理解其内部机制,优化自定义的网络请求。 Volley 的主要特性包括: 1. **缓存策略**:Volley 提供了内存和磁盘两级缓存,...

    Android Volley框架使用源码分享

    过去在Android上网络通信都是使用的Xutils 因为用它可以顺道处理了图片和网络这两个方面,后来发觉Xutils里面使用的是HttpClient 而Google在6.0的版本上已经把HttpClient废除了,所以开始寻找新的网络框架,okhttp...

    Android-网络通信框架Volley使用详解

    综上所述,Volley作为Android的网络通信框架,提供了丰富的功能,能够满足大多数网络请求的需求。通过理解并熟练运用上述知识点,开发者可以构建出高效、稳定的网络通信应用。在实际项目中,结合Volley与其他工具...

    volley网络框架讲解demo

    在“Volley网络框架讲解demo”中,你将通过实际的代码示例了解这些概念,并学习如何在你的Android项目中有效地应用Volley。通过这个demo,你不仅可以掌握Volley的基本用法,还能深入理解其背后的优化策略,这对于...

    Android Volley Demo

    ### 一、Volley框架核心组件 1. **RequestQueue**: 请求队列是Volley的核心,负责管理和调度所有的网络请求。它会根据请求的优先级进行排序,并在后台线程中执行。 2. **NetworkDispatcher**: 负责处理网络请求,...

    Android 网络通信框架Volley的二次封装

    当前十分热门的Volley网络框架,也是在2013年Google I/O大会上推出了一个新的网络通信框架。Volley把AsyncHttpClient和Universal-Image-Loader的优点集于了一身,既可以像AsyncHttpClient一样非常简单地进行HTTP通信...

    Android网络框架-Volley(一) 初步使用Volley

    Volley是Google为Android开发的一款高效的网络通信库,它的设计目标是简化网络请求,并优化了内存管理和线程处理,使得在网络交互中能提供快速、流畅的用户体验。在本篇文章中,我们将深入探讨Volley的基本使用,...

    volley网络通信框架的基本使用

    Volley作为一个轻量级的网络通信框架,以其简洁的API、高效的缓存策略和良好的错误处理机制,成为Android开发中网络通信的常用工具。通过以上步骤,开发者可以轻松地实现登录功能并与后台进行数据交互,从而提升应用...

    android Volley的基本使用详解

    Volley提供了高效、易用且功能丰富的网络通信框架,使得开发者可以方便地进行网络数据的获取和发送。 ## 一、Volley简介 Volley的核心理念是快速响应,它通过在主线程中缓存网络请求和响应,减少了UI的延迟。...

    android最新网络框架Volley使用实例

    Volley是Google为Android开发的一款高效的网络通信框架,它的设计目标是简化网络请求,并优化Android设备上的图片加载。Volley以其高效、灵活和易于使用的特性,成为许多Android开发者首选的网络库。 首先,我们来...

    Android Volley框架之网络请求和图片加载.rar

    Android Volley框架是Google推出的一款高效的网络通信库,主要设计用于Android应用中的网络请求处理,尤其在处理小数据量和高频率的网络交互时表现出色。它优化了网络请求的性能,降低了延迟,提高了用户体验。...

    Google I/O 2013推荐Android 网络通信框架Volley

    Volley是Google在2013年的I/O大会上推出的一款高效的Android网络通信框架,它专为Android应用设计,旨在简化网络请求的处理,提高应用程序的响应速度和用户体验。这款框架的核心理念是快速、高效和易用,使得开发者...

Global site tag (gtag.js) - Google Analytics