2015-12-22 70 views
2

我有一個for循環,這是創建不同的網址,然後我使用add功能推Volley RequestQueue中的網址。 我有一個問題,響應列表程序會按照添加到RequestQueue的請求的順序響應,還是根據請求的服務器響應進行隨機響應? 我正在使用VolleySingleton方法。排球請求隊列中的響應順序是什麼?

回答

2

號。的Android凌空過程在異步請求隊列中的每個請求..

參考架構圖像

https://packetzoom.com/blog/images/volley_arch.png

在請求隊列中的每個請求將被網絡threads.and被處理也可以限制網絡調度員線程數檢查http://stackoverflow.com/questions/22744148/what-is-the-maximum-size-of-the-volley-library-request-queue

+0

所以你的意思是,它對於每一個請求都有不同的線程? – Vishesh

+0

@VISHESH編輯答案 –

+0

所以我怎麼能區分的答覆,我已經設置標籤的請求,但我無法找出如何確定答覆。 (我們可以取消基於標籤的請求,但有沒有辦法根據接收到的響應來識別請求?) – Vishesh

5

Volley RequestQueue類管理異步請求隊列。

這意味着Volley在FIFO(先入先出)模型上發送請求,但由於響應可能會很長時間纔會返回,因此它會以特定順序處理響應。 如果您希望在第二個請求中使用第一個請求的結果,則不能使用它。

但是,可以明顯地使用RequestFuture類使用排在synchonous型號:Can I do a synchronous request with volley?

+0

Pierre, 是的,我希望我的第一個請求的結果可以在第二個請求中使用。然後我要在第三個請求中使用第二個請求的結果。 請問,我如何鏈接這樣的排球請求? – JDOaktown

3

默認情況下,凌空RequestQueue將使用4 concurrent Threads處理Requests加入Queue。這可以通過擴展RequestQueue類並將想要的線程池大小作爲第三個參數傳遞給super構造器來更改。

1傳遞給構造將導致在時間:-)

+0

有關使用4個併發線程的聲明的任何引用? – Talha

+1

當然:-) http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.3_r1/com/android/volley/RequestQueue.java#73 – Kelevandos

+0

你可能會希望將這行'DEFAULT_NETWORK_THREAD_POOL_SIZE = 4'作爲參考添加到您的答案中,所以它會更真實。 +1爲官方參考鏈接。 – Talha

1

RequestQueue處理一個請求假定默認行爲是在單獨的併發線程發送多個請求,則響應的順序就成爲取決於每個單獨請求的總響應時間。

至於識別響應(數據本身除外),您似乎應該能夠使用唯一請求標識符(原始URL或int)實例化Response.Listener實現,以便在調用響應處理程序時它能夠區分原始請求。

public class JSONProcessor implements Response.Listener<JSONObject> { 
    private String url; 
    private int reqCode; 

    public JSONProcessor (String reqUrl) { 
     this.url = reqUrl 
    } 

    public JSONProcessor (int reqCode) { 
     this.reqCode = reqCode; 
    } 

    public void onResponse(JSONObject response) { 
     // use this.url or this.reqCode to determine original request 
     // process response 
    } 
} 

或者,對您希望處理的每個端點使用不同的Response.Listener實現。

一般來說,在我看來,如果可能的話最好是完全數據驅動的。