天天看點

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來進行處理。

結束。