我們知道,在網絡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來進行處理。
結束。