Volley的使用(一)


Volley是google推荐的Android网络数据访问处理的库,具有简化网络数据访问、多并发、支持缓存、允许取消网络请求、支持自定义复杂网络数据请求等优点。另外,Volley也提供了处理大量网络图片、处理Json数据的工具。不过,Volley也有它的局限性。它不适用于大文件数据的下载,因为Volley在解析网络数据的过程中会将这些数据都放在内存中,处下载大型文件可能会导致内存OOM问题。在开发中,大部分情况都不需要下载大型数据文件,所以Volley还是能够满足大部分开发需求的。


1、Volley源码的下载


Volley源码使用git工具管理,可以使用git工具下载:

git clone https://android.googlesource.com/platform/frameworks/volley

由于众所周知的原因,不会翻墙的童鞋也可以到github上面下载:

git clone https://github.com/mcxiaoke/android-volley.git


2、Volley的主要类


2.1 Request<T>:Request类是Volley的核心类之一,是个抽象类,代表网络请求的操作。Volley的com.android.volley.toolbox包中提供了Request类的几个具体子类,包括StringRequest(网络请求返回的数据类型是字符串)、ImageRequest(网络请求返回的数据类型是Bitmap)、JsonObjectRequest(网络请求返回的数据类型是JsonObject),以及JsonArrayRequest(网络请求返回的数据类型是JsonArray)。想要发起一次网络请求,必须先创建一个具体的Request对象。一般直接使用toolbox中提供的Request具体子类,当然可以直接继承Request来实现特殊的网络请求。


2.2 RequestQueue:RequestQueue也是Volley的核心类之一,该类中包含了缓存管理和网络请求管理。想要发起网络请求,必须先获取一个RequestQueue对象,然后将创建的具体Request对象通过RequestQueue.add()方法添加进来,Request的网络请求才会真正执行。


2.3 DiskBasedCache:管理硬盘缓存的类,RequestQueue类中的缓存管理默认由DiskBasedCache类实现,该类中默认的缓存大小为5M。


2.4 BasicNetwork:管理网络请求的类,RequestQueue类通过BasicNetwork类实现网络请求的管理。这个类需要提供一个HttpStack对象才能真正实现网络请求,Volley提供了两个HttpStack子类:HurlStack(内部通过HttpURLConnection实现)和HttpClientStack(HttpClient client)。


2.5 Volley:Volley的工具类,通过Volley.newRequestQueue()方法可以返回一个RequestQueue对象。在newRequestQueue方法中会将DiskBasedCache和BasicNetwork组装到最终返回的RequestQueue对象中。Volley类中有多个newRequestQueue方法的重载,所有的这些方法最终都是通过Volley.newRequestQueue(Context, HttpStack, int)方法实现,这个方法第二个参数HttpStack为BasicNetwork提供Http client实现,如果为null,newRequestQueue会自动提供最适合当前Android版本的HttpStack对象;第三个参数为DiskBasedCache提供缓存的大小,默认为5*1024*1024,也就是5M。如果没有特殊的需求,建议直接使用Volley.newRequestQueue创建RequestQueue对象。


3、Volley的线程结构设计


Volley的架构从功能上来区分,主要跨越了主线程(也就是UI线程)、缓存线程和网络线程。以下是Volley的线程结构设计图:


图中蓝色部分为主线程、绿色部分为缓存线程(只有一个)、橙色部分为网络线程池。整个发送网络请求的过程大致如下:

3.1 主线程中通过Volley.newRequestQueue()等方法获取RequestQueue对象,创建具体的Request对象并通过RequestQueue.add(Request)方法添加该对象。

3.2 添加Request对象到RequestQueue后会进入缓存线程,在缓存线程查询是否有该Request对象的缓存。如果有,则直接将缓存的响应数据返回到主线程,本次访问结束。如果没有,则进入下一步。

3.3 从网络线程池中分配一个空闲的线程给该Request对象(使用Volley.newRequestQueue()创建的RequestQueue默认线程池最多4个线程),并执行Request对象定义的相关网络访问操作,以及解析数据,保存数据等等,网络访问完毕后返回主线程。


4、Volley项目导入使用


使用Volley有三种方式:

4.1 第一种方式直接将Volley的源码打包出jar文件放到自己Android项目的libs目录下

4.2 使用maven管理工具的项目可以在pom.xml文件中添加下面依赖:

<dependency>
    <groupId>com.mcxiaoke.volley</groupId>
    <artifactId>library</artifactId>
    <version>{latest-version}</version>
</dependency>
4.3 使用Android Studio的可以只项目module的gradle文件中添加下面依赖:

compile 'com.mcxiaoke.volley:library:1.0.16'


5、使用StringRequest


StringRequest的使用比较简单,直接上代码:

    
    String url = "http://www.baidu.com";
    StringRequest mRequest;
    TextView tvStringRequest;
    @Override
    public void onResume() {
        super.onResume();
        mRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                tvStringRequest.setText(response);
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                tvStringRequest.setText(error.getMessage());
            }
        });
        
        tvStringRequest.setText("start call...");
        Volley.newRequestQueue(this).add(mRequest);
    }

    @Override
    public void onStop(){
        if(mRequest != null){
           mRequest.cancel();
        }
        super.onStop();
    }

其中,在onStop()中使用Request.cancel()方法取消网络请求访问。

另外,由于要访问网络,所以需要在manifest中添加访问网络的权限。



Volley是一个优秀的安卓开源网络访问工具,这里包含了volley jar包和源码,版本是2015.07.28的1.0.18版本。更多资料可以参见volleygithub地址: https://github.com/mcxiaoke/android-volley 1.0.18 2015.07.28 merge upstream, process response bodies only when present tweak getCacheKey(), using method and original url, fix #67 #78 add RedirectError, wrong exception for http 301 and 302, fix #51 make NetworkResponse Serializable, fix #53 create NetworkError using IOException, not using null response 1.0.17 2015.07.13 merge upstream, stop logging slow requests outside of debug logs merge pr #64, fix leaking the last request object 1.0.16 2015.05.18 fix duplicate retry, change DEFAULT_MAX_RETRIES to 0 merge pr, fix NegativeArraySizeException merge upstream, Use a BufferedOutputStream to read and write cache 1.0.15 2015.03.18 add two missing constructors for JsonArrayRequest and JsonObjectRequest add unique identifier for Request 1.0.14 2015.03.17 add more constructors for JsonArrayRequest and JsonObjectRequest update and fix gradle build, using new build.gradle 1.0.13 2015.03.16 merge pr, added constructor to JSONArrayRequest 1.0.12 2015.03.12 merge upstream, fix ImageLoader.getCacheKey() merge upstream, Fix broken DiskBasedCache merge upstream, Modify header parser to handle must-revalidate. 1.0.11 2015.03.03 merge upstream, Add a RequestFinishedListener to RequestQueue. merge upstream, Change the default character encoding for JSON responses to UTF-8 1.0.10 2014.12.30 merge upstream, Use the view size and scale type to restrict NIV requests. merge pr, Add a getImageURL method to NetworkImageView merge pr, Add the options of setting DiskBasedCache sizes in Volley.java 1.0.9 2014.11.26 merge upstream, Fix deprecation warnings (now errors in 0.14.4) w/ gradle. 1.0.8 2014.11.07 merge upstream, Metric for network time and getBackoffMultiplier() 1.0.7 2014.10.13 merge upstream, Add locale to HttpHeaderParserTest.rfc1123Date(long millis) merge upstream, Copy cache header for 304 response 1.0.6 2014.09.10 merge pr, fixed bug where Disk cache misses for redirects merge upstream, Fix crash/OOM in DiskBasedCache merge upstream, allow use of custom ImageRequests in ImageLoader 1.0.5 2014.06.18 merge upstream, Fixes bug in PATCH method. Sets the method before setting the body. update gradle and build tools version, fix build 1.0.4 2014.05.04 merge upstream, Guard against NullPointerException currently occurring in Volley when a Request is given a url whose host is null. 1.0.3 2014.04.01 merge upstream, ImageLoader: setError after null check 1.0.2 2014.02.28 merge upstream, Use the view size to restrict NIV requests. merge upstream, Fix generic type parameter for RequestQueue.add(Request) merge pr, added support for handling 301 and 302 http redirects using standalone deploy gradle build file and script 1.0.1 2014.02.13 add gradle build support, add readme, release using gradle 1.0.0 2014.01.03 create volley mirror at github, release first version
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值