您的位置:首页 > 理论基础 > 计算机网络

谷歌Volley网络框架讲解——第一篇

2015-04-20 17:56 501 查看

谷歌Volley网络框架讲解——第一篇

自从公司新招了几个android工程师后,我清闲了些许。于是就可以有时间写写博客,研究一些没来的研究的东西。

今年的谷歌IO大会上,谷歌推出了自己的网络框架——Volley。不久前就听说了但是没有clone下来,这次终于把源码弄下来了。

这个框架对网络请求数据缓存做了很多优化,其他说明就请自行百度吧。。。

在这梳理一下网络请求的过程:

先看一段网络请求的代码吧

mQueue=Volley.newRequestQueue(getApplicationContext());
//StringRequest四个构造参数分别是Request类型,url,网络请求响应监听器,错误监听器
mQueue.add(newStringRequest(Method.GET,"http://www.baidu.com/",newListener<String>(){

@Override
publicvoidonResponse(Stringarg0){
//TODOAuto-generatedmethodstub
Log.e("onResponse",arg0);
}

},newErrorListener(){

@Override
publicvoidonErrorResponse(VolleyErrorarg0){
//TODOAuto-generatedmethodstub
Log.e("onErrorResponse",arg0.toString());
}

}));
mQueue.start();


Volley

首先,通过Volley的静态方法new一个请求队列,再调用请求队列(RequestQueue是由缓存和网络线程构造的)的start方法。

然后,得到一个RequestQueue请求队列时,就添加一个请求Request,Volley提供有三种请求的封装,一个是StringRequest,一个事ImageRequest,还有一个是JsonRequest。

最后,调用RequestQueue的start方法就可以开始一条网络请求了。

可以看出Volley只是RequestQueue的一个helper。

RequestQueue

所以,这里一个最核心的就是RequestQueue请求队列这个了。

这个请求队列是有两个东西完成,一个是cache一个network。

这个RequestQueue的构造形式有四种:除了上面这两个还有线程池数量,响应委派。

1,publicRequestQueue(Cachecache,Networknetwork,intthreadPoolSize,ResponseDeliverydelivery)

2,publicRequestQueue(Cachecache,Networknetwork,intthreadPoolSize)

3,publicRequestQueue(Cachecache,Networknetwork)

其实Cache和Network真正的工作者还是CacheDispatcher缓存调度和NetworkDispatcher网络调度。下期再详细讲解Dispatcher。。

RequestQueue的成员方法主要有下面几个:

publicvoidstart();//请求队列开始进行调度发vgm

publicvoidstop();//队列退出调度

publicRequestadd(Requestrequest);//添加一个请求,通过调用start()来执行

voidfinish(Requestrequest);//这个方法应该是释放请求资源的方法

publicvoidcancelAll();//取消当前的请求

NetworkDispatcher

这个就是网络调度的核心,这是一个继承Thread的类,构造方法如下

publicNetworkDispatcher(BlockingQueue<Request>queue,Networknetwork,Cachecache,ResponseDeliverydelivery)

一个Request的队列,Network,Cache,ResponseDelivery。。。

它的run()方法就是把请求队列取出一个Request,让Network去执行一次请求再通过ResponseDelivery进行解析。

Network

/**
*Aninterfaceforperformingrequests.
*这是执行一个请求的接口
*/
publicinterfaceNetwork{
/**
*Performsthespecifiedrequest.
*@paramrequestRequesttoprocess
*@returnA{@linkNetworkResponse}withdataandcachingmetadata;willneverbenull
*@throwsVolleyErroronerrors
*/
publicNetworkResponseperformRequest(Request<?>request)throwsVolleyError;
}


这是一个接口,执行请求获取响应,一个是NetworkResponse一个是Request。

Request

它的构造方法:

publicRequest(intmethod,Stringurl,Response.ErrorListenerlistener)

第一个method就是请求类型,包括get,put,post,delete;第二个就是请求的url咯,第三个是ErrorListener。

subclass有StringRequest,ImageRequest,JsonObjectRequest,JsonArrayRequest。

1.StringRequest是继承Request<String>,对应String的ResponseListener交付请求结果。

publicStringRequest(intmethod,Stringurl,Listener<String>listener,ErrorListenererrorListener)

2.JsonRequest有JsonObjectRequest和JsonArrayRequest两个子类,通过parseNetworkResponse(NetworkResponseresponse)来处理JsonObject和JsonArray两个不同结果。

3.ImageRequest的构造参数比较多,主要针对图片的一些处理工作。多了一个限制图片最大长宽和configOptions图片类的东西。

publicImageRequest(Stringurl,Response.Listener<Bitmap>listener,intmaxWidth,intmaxHeight,ConfigdecodeConfig,Response.ErrorListenererrorListener)

Response

Request有个把NetworkResponse解析成Response<T>的抽象方法。

abstractprotectedResponse<T>parseNetworkResponse(NetworkResponseresponse);

然后调用Response.Listener<T>的接口返回String,Json或bitmap。最后得到了想要的东西就可以随便怎么处理了。

Response有两个接口,一个是Listener回调期望内容的接口和一个ErrorListener接口。

/**Callbackinterfacefordeliveringparsedresponses.*/
publicinterfaceListener<T>{
/**Calledwhenaresponseisreceived.*/
publicvoidonResponse(Tresponse);
}


onResponse()把想要的json或者string,bitmap数据传回来


/**Callbackinterfacefordeliveringerrorresponses.*/
publicinterfaceErrorListener{
/**
*Callbackmethodthatanerrorhasbeenoccurredwiththe
*providederrorcodeandoptionaluser-readablemessage.
*/
publicvoidonErrorResponse(VolleyErrorerror);
}


onErrorResponse会返回一个VolleyError的错误,可以根据这些error进行响应的处理。


VolleyError

这个类继承Exception,用来捕获各宗异常。

在NetworkDispatcher里有个处理异常的方法parseAndDeliverNetworkErrorRequest<?>request,VolleyErrorerror();

在请求的过程中把各种异常抛出,然后通过Response的ErrorListener捕获异常进行处理。

整个过程差不多就是这样,梳理一番就很清楚,不过谷歌的代码就是很神,比其他网络上哪些炒来炒去的框架质量好不少,层次分明结构清晰,看着都赏心悦目。

我们再回过头来看一下这个请求方法的使用,就很清楚了。

mQueue=Volley.newRequestQueue(getApplicationContext());
//StringRequest四个构造参数分别是Request类型,url,网络请求响应监听器,错误监听器
mQueue.add(newStringRequest(Method.GET,"http://www.baidu.com/",newListener<String>(){

@Override
publicvoidonResponse(Stringarg0){
//TODOAuto-generatedmethodstub
Log.e("onResponse",arg0);
}

},newErrorListener(){

@Override
publicvoidonErrorResponse(VolleyErrorarg0){
//TODOAuto-generatedmethodstub
Log.e("onErrorResponse",arg0.toString());
}

}));
mQueue.start();


好了今天就到这,下班回家。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: