天天看点

Android中关于Volley的使用(十)对Request和Reponse的认识

我们知道,在网络http通信中,一定会有一个request,同样的,也一定会有一个response,而我们在volley中利用requestqueue来添加请求之前,一定会先创建一个request对象,比如stringrequest,jsonobjectrequest和imagerequest等,如下分别是前面demo中的jsonrequest和imagerequest:

jsonobjectrequest:

imagerequest:

volley中提供了一个基础的request抽象类,如下:

在这个类中,定义了一些请求中基本的参数变量,如

method:

它的值如下:

请求中的url:

一个errolistener,

还有其它的一些参数,如shouldcache(是否需要缓存),tag(分类标签)等,而在request中还提供了下面两个抽象方法,必须由子类实现:

每一个子类都必须实现两个方法,

1)parsenetworkresponse

当从网络中获取到response的时候,怎么去解析对应的请求,这是由各个对应的request去分析的,比如jsonobjectrequest中:

再比如imagerequest中的:

而在doparse中,其实是对图片进行处理,如下:

所以,如果我们自定义一个request的话,我们就要去实现我们自己的逻辑,比如是获取视频的话,就会去对数据进行解码等。

在上面的方法实现中,我们可以看到,最后都是通过response.success方法返回一个response对象,而这个response对象是怎么用的呢,就要看下面deliverresponse方法了。

2)deliverresponse

在networkdispatcher线程中,当从网络中获取到数据,并通过请求的parsenetworkresponse方法解析之后,会返回一个reponse对象,这个时候,就会调用executor来将这个请求post回主线程,如下:

而mdelivery中的postresponse方法其实是另起一个新线程来调用request的deliverresponse方法,在executordelivery类中:

responsedeliveryrunnable类的run方法中,我们可以看到:

那我们看看stringrequest和imagerequest中的deliverresponse方法:

我们可以看到,其实都是调用一个response.listener类的onresponse方法,而其实这个listener,则是我们在创建请求的时候才实现,并传进来的,如前面demo中创建jsonobjectrequest和imagerequest的时候:

如上面new reponse.listener方法中的实现,很显然,之所以这么做的原因在于只有调用者才知道怎么去处理request解析过的数据。

而从这里,我们也可以知道在reponse类中,就会定义这么一个接口,如下,是volley中response类的定义:

而除了这个接口的定义,还有一个errorlistener接口的定义就不列出来了。而除此之外,response类中就存放了cacheentry等信息,相对来说,因为定义了这样的listener接口,response类是相对比较简单的。

好了,到这里,总结一下:

1)创建一个request的时候,会同时设置一个response.listener作为请求的一个参数变量,之后调用requestqueue的add方法将其添加到queue。

2)在queue中的请求会由networkdispatcher去跟网络进行通信(如果有缓存的时候,就是cachedispatcher)。

3)当请求结果回来的时候,request会首先调用parsenetworkresponse方法根据不同的请求类型,如json,image等进行不同的处理。

4)当request分析完之后,得到的reponse对象,就会由responsedelivery类新起一个线程,调用1)步中的listener来进行处理。

结束。