首页 > 代码库 > Volley(一)

Volley(一)

为什么使用Volley

        Android提供了两个HTTP库给开发者来进行实现一个HTTP请求,一个是AndroidHttpClient (从apache HttpClient拓展而来),另一个是HttpUrlConnection。两者都互有优缺点。当我们开发一个应用,一般来说,我们会写一些Http连接类,这些类可以处理所有Http请求,创建后台线程,管理线程池,解析response,缓存response,处理异常状态码、SSL连接,实现并行或者串行请求。每一个开发者都有自己的方式去实现这些方法。有些人可能会用AsycnTask在后台完成网络请求,有些人可能经过处理程序从UI线程创建HTTP连接类,然后在工作线程执行网络操作,再使用处理程序解析HTTP response返回主线程。 

      但是我们最终会重复编写相同的样板代码,我们试图在我们的应用程序重复造轮子。

      例如,下面的代码片段,在AysncTask的doBackground 里实现一个HTTP请求。当我们获取response,把数据从HttpUrlConnection的输入流拷贝到输出流,然后把输出流再转化成我们最终想要的JsonObject。所有这些样板代码在我们的代码中重复出现。

HttpURLConnection urlConnection = null;try {   URL url = new URL("http://www.android.com/");   urlConnection = (HttpURLConnection) url.openConnection();   InputStream in = new BufferedInputStream(urlConnection.getInputStream());   ByteArrayOutputStream outputStream = new ByteArrayOutputStream();   byte[] buffer = new byte[1024]; // Adjust if you want   int bytesRead;   while ((bytesRead = in.read(buffer)) != -1) {     outputStream.write(buffer, 0, bytesRead);   }   JSONObject resultJSON = new JSONObject(outputStream.toString());}catch (Exception e) {       e.printStackTrace();} finally {     urlConnection.disconnect();}

       所以谷歌提出volley,帮助开发人员处理相关的所有网络操作,这样开发人员可以集中精力实现HTTP响应后的业务逻辑。从而可以更少的网络代码调用,这样可以帮助开发者减少bug数量。

注意Volley在大文件操作中并不很适用,如上传/下载,这些case,还需要使用原始的方法

以下是Volley的一些关键特性:

    为Android提供更快的网络请求

    在后台线程中调度、并行实现所有HTTP请求并管理这些线程

    提供灵活的方法来同步并发运行你的网络请求

    带有内置的Json解析器

   可以设置请求的优先级

   为某些情况提供重试策略,如超时,内部服务器错误

   可以很灵活的取消请求

    提供图片的内存和磁盘缓存,批量处理下载

   可以很灵活的实现自己的缓存

   可以实现自己的HTTPStack(处理SSL连接,PATCH请求)

   请求可以跟踪调试

   可以和Activity和生命周期的联动(Activity结束时同时取消所有网络请求)

 

集成Volley项目

从git资源库Clone Volley项目:

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

 可以通过两种方式集成

    生成Volley.jar,放到libs目录

    把volley项目作为一个library依赖

使用Volley主要涉及连个类RequestQueue 和Request

RequestQueue ---调度请求队列并在工作线程执行请求,然后响应给主线程

Request---所有的网络请求都可以通过此类来创建,它提供了一个HTTP请求所需的主要参数,譬如:

   请求类型-GET,POST,PUT,DELETE

   URL

   请求数据(HTTP Body)

   成功响应监听

   错误监听

 

简单使用

 初始化RequestQueue

 

 JsonObjectRequest


 

StringRequest

 

GsonRequest

 当然你也可以自定义Request,使得其可以返回对应的Java类型。譬如,我们可以用Gson来自定义一个Request。


使用的时候和StringRequest和JsonObjectRequest差不多